Arduino вопросы про кнопки и можно ли заменить энкодер потенциометром?

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
Здравствуйте, хочу реализовать данный контроллер: https://www.instructables.com/Bluetooth-ZoomOBS-Controller/
1637266084110.png
Появились вопросы:
1) Можно ли заменить кнопки на те, что ниже? (можно ли запрограммировать так, чтобы каждое переключение расценивалось как обычное нажатие?)
1637266007018.png
2) Если на кнопках написано 12в, а я подам 5в, просто не будет работать подсветка, но Uout будет равно Uin?
3) Можно ли для регулировки громкости динамиков вместо энкодера использовать обычный или многооборотный потенциометр? как измениться код программы?
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
1) Можно
2) Возможно даже будет работать подсветка, только не так ярко
3) Можно, вам надо будет разобраться, как работает AnalogRead (ну и надо учесть, что потенциометра есть предел по прокрутке)
 
Изменено:
  • Лойс +1
Реакции: ambilight

Nikanor

★★✩✩✩✩✩
1 Окт 2020
178
51
@ambilight, под ваши хотелки придётся переписывать половину программы.
судя повашим вопросам вы этого не осилите.
будете заказывать на стороне за денежку ?
 

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@Nikanor,
Хотел припаять кнопку к esp32 и поэксперементировать в IDE, открыл новый паяльник CXG E60W, кнопка нормально не лудится и через двадцать минут работы при температуре 340 паяльник перестал лудиться....весело в общем.
И сколько будет стоить модифицирование программы? В идеале мне бы ещё программу с графическим интерфейсом, чтобы любому человеку было удобно перепрограммировать кнопки, то есть, 3 поля: выберите кнопку, введите горячую клавишу, применить.
1637334498342.png
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
178
51
это уже называется не модификация программы, а написание её с нуля.
с графическим интерфейсом попадёте тыщ в десять и более.
 

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@Nikanor,Там элементарно, тогда не надо. Меня больше интересует аппаратная часть, сколько может стоить спаять такой контроллер (без аккумулятора, чтобы по проводу работал) и прислать в европу?
 

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@Lumenjer,
Делаю на esp32.
Может у вас есть код для таких кнопок, припаял минус к gnd, плюс к D15, воспользовался этим кодом, но в мониторе порта, при нажатии на кнопку ничего не появляется.
1637411679725.png

C++:
#include <Arduino.h>

const int PIN_BUTTON = 15;   

int button_state = 0;

void setup() {
  Serial.begin(115200); 
  pinMode(PIN_BUTTON, INPUT_PULLDOWN);
}

void loop() {
  button_state = digitalRead(PIN_BUTTON);
  Serial.println(PIN_BUTTON);

  if (button_state == HIGH) {
   Serial.println("pressed");
  } else {
   Serial.println("nothing");
  }
}
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
В вашем случае вместо
pinMode(PIN_BUTTON, INPUT_PULLDOWN);
надо
pinMode(INPUT, INPUT_PULLUP)
 

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@Lumenjer, Спасибо, появилась слабое свечение на кнопке, но в мониторе порта теперь всегда "pressed", независимо от состояния кнопки.
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@ambilight, Вы изменили подтяжку, т.е. подтянули пин к питанию, проверку тоже надо изменить
if (button_state == LOW)
Сколько выводов у кнопки? 2 или 3?
 

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@Lumenjer,
3, но припаял два, плюс и минус, на али, так было написано.
1637412490270.png

Странно, он ведь постоянно опрашивает pin включил, должен срабатывать if, иначе else.

Хорошо, на нажатие реагирует, а как сделать, чтобы, например, один раз происходила какая-то команда, нажимаю на кнопку, один раз выводить надпись, нажал ещё раз (вернул в исходное состояние) ещё раз надпись вывелась.
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@ambilight, Как то так
C++:
#include <Arduino.h>

const int PIN_BUTTON = 15;  

bool button_state = false;
bool old_state = false;
void setup() {
  Serial.begin(115200);
  pinMode(PIN_BUTTON, INPUT_PULLUP);
}

void loop() {
  button_state = digitalRead(PIN_BUTTON);
  Serial.println(PIN_BUTTON);

  if (button_state != old_state) {
     Serial.println("switch");
     old_state = button_state;
  }
}
 
Изменено:

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@Lumenjer, В таком виде ничего не выводится, если заменить
INPUT_PULLDOWN на INPUT_PULLUP, то в положении O ничего, в положении I постоянно выводиться switch слово.
А можно, чтобы при переключении только один раз выполнялось действие?

положение O, переключаю в I -> вывелась один раз надпись и программа ждёт следующего переключения, I -> O -> ещё раз вывелась надпись.
 

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@Lumenjer,
Опять не так :)
Как такого типа кнопка работает правильно: в положении O ничего не происходит, при I постоянно выводит switch, но я хочу чтобы один раз срабатывало действие при каждом переключении, или такое невозможно?
1637415567128.png
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@ambilight, Предлагаете мне реализовать вам еще и антидребезг?)
Берите библиотеку с кнопкой и подставляйте под тот пример, что я дал

Как то так
C++:
#include <Arduino.h>

const int PIN_BUTTON = 15;

bool button_state = false;
bool old_state = false;
void setup() {
Serial.begin(115200);
pinMode(PIN_BUTTON, INPUT_PULLUP);
}

void loop() {
button_state = digitalRead(PIN_BUTTON);
Serial.println(PIN_BUTTON);

if (button_state != old_state) {
Serial.println("switch");
old_state = button_state;
}
}
 

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@Lumenjer, Вроде смог подключить esp32 к компьютеру, хотя постоянно была ошибка "нет ответа на запрос о сопряжении" и "неверный pin", но ctrl+alt+delete не нажимается после нажатия кнопки, где может быть ошибка?

C++:
#include <BleKeyboard.h>
BleKeyboard bleKeyboard("ZoomBox","Ph");
boolean connected;
#define BTN1 15
#define NUMBUTTONS 1

int buttons[NUMBUTTONS] = {BTN1};
unsigned long btntime[NUMBUTTONS];
boolean btnpress[NUMBUTTONS];

char line[80];
unsigned long t;
int n;

void setup() {
  Serial.begin(9600);
  Serial.write("Starting...\n");

  for (int i = 0; i < NUMBUTTONS; i++) {
    pinMode(buttons[i], INPUT_PULLUP);
    btntime[i] = 0;
    btnpress[i] = false;
  }
  bleKeyboard.begin();
  connected = false;
}

void loop() {
if (!connected) {
    connected = true;
  }
  for (int i = 0; i < NUMBUTTONS; i++) {
    if (!digitalRead(buttons[i]))
      {
      if (btntime[i] == 0) {
        btntime[i] = millis();
      }
      else {
        if (millis() - btntime[i] > 20 && !btnpress[i]) {
          btnpress[i] = true;
          Serial.println(i);
          switch (i) {

          case 0:
            bleKeyboard.press(KEY_LEFT_CTRL);
            bleKeyboard.press(KEY_LEFT_ALT);
            bleKeyboard.press(KEY_DELETE);
            delay(100);
            bleKeyboard.releaseAll();
            break;

          }
        }
      }
    }
    else {
      if (btntime[i] != 0) {
        btntime[i] = 0;
        btnpress[i] = false;
      }
    }
  }
}
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@ambilight, Пихайте туда выводы в порт и смотрите, срабатывает ли вообще
C++:
switch (i) {

    case 0:
        Serial.println("Test");
        bleKeyboard.press(KEY_LEFT_CTRL);
        bleKeyboard.press(KEY_LEFT_ALT);
        bleKeyboard.press(KEY_DELETE);
        delay(100);
        bleKeyboard.releaseAll();
        break;
 

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@Lumenjer,При нажатии кнопки ничего не происходит, и не получается открыть bluetooth монитор,
bluetooth адаптер использует com11,com12, но когда пытаюсь открыть монитор порта, постоянно показывает, что он занят.
Error opening serial port 'COM11'. (Port busy)
Error opening serial port 'COM10'. (Port busy)
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
bluetooth адаптер использует com11,com12, но когда пытаюсь открыть монитор порта, постоянно показывает, что он занят.
Error opening serial port 'COM11'. (Port busy)
Error opening serial port 'COM10'. (Port busy)
сразу два порта? - по-моему, вы чего-то путаете
10 и 11 - это случаем не пины для подключения блютус к ардуино?
 

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@bort707,Я подключил кнопку к двум пинам к esp32, GND и D15.Подсоединил к повербанку, подключил esp32 к компьютеру по bluetooth и не могу попасть в монитор порта, чтобы проверить, работает ли кнопка припаянная, вот код, в монитор порта должна вывестись надпись и должна сработать команда ctrl+alt+delete.
C++:
#include <BleKeyboard.h>
BleKeyboard bleKeyboard("ZoomBox","Ph");
boolean connected;
#define BTN1 15
#define NUMBUTTONS 1

int buttons[NUMBUTTONS] = {BTN1};
unsigned long btntime[NUMBUTTONS];
boolean btnpress[NUMBUTTONS];

char line[80];
unsigned long t;
int n;

void setup() {
  Serial.begin(9600);
  Serial.write("Starting...\n");

  for (int i = 0; i < NUMBUTTONS; i++) {
    pinMode(buttons[i], INPUT_PULLUP);
    btntime[i] = 0;
    btnpress[i] = false;
  }
  bleKeyboard.begin();
  connected = false;
}

void loop() {
if (!connected) {
    connected = true;
  }
  for (int i = 0; i < NUMBUTTONS; i++) {
    if (!digitalRead(buttons[i]))
      {
      if (btntime[i] == 0) {
        btntime[i] = millis();
      }
      else {
        if (millis() - btntime[i] > 20 && !btnpress[i]) {
          btnpress[i] = true;
          Serial.println(i);
          Serial.println("hello");
          switch (i) {

          case 0:
            Serial.println("Test");
            bleKeyboard.press(KEY_LEFT_CTRL);
            bleKeyboard.press(KEY_LEFT_ALT);
            bleKeyboard.press(KEY_DELETE);
            delay(100);
            bleKeyboard.releaseAll();
            break;

          }
        }
      }
    }
    else {
      if (btntime[i] != 0) {
        btntime[i] = 0;
        btnpress[i] = false;
      }
    }
  }
}
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
@ambilight, или я ничего не понял, или у вас какая-то каша в голове. Как связан "монитор порта" и блютуз? И с чего Вы решили, что строчки. которые Вы в коде отправляете в Serial - должны появлятся в блютузе?

Напишите подробно, как именно вы подключаете "esp32 к компьютеру по bluetooth ". У вас на компе есть встроенный БТ? Или это внешний модуль?
 
  • Лойс +1
Реакции: Старик Похабыч

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@bort707,bluetooth адаптер csr8510 вставлен в usb порт компьютера. Прошил esp32,и добавил его.
1637486164801.png
Сейчас я добиваюсь того, чтобы кнопка подключенная к пинам GND и D15 при переключении её, нажимала ctrl+alt+delete. Но этого не происходит.
1637486268714.png
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
все равно не понял, с чего вы взяли что строчка кода
C++:
Serial.println("test");
что-то посылает в блютуз.

Если вы ждете срабатывания кнопки по выводу в Монитор порта - вы так ничего никогда не увидите
 

ambilight

✩✩✩✩✩✩✩
12 Июл 2021
31
0
@bort707,
Хорошо, ничего в монитор мне выводить не надо.
Как мне сделать так, чтобы при нажатии на кнопку ОДИН раз срабатывала команда, в моём случае ctrl+alt+delete?