Comments (21)
Привет, как раз для этого и предусмотрен виртуальный режим. Опрашивать расширитель любыми своими способами и передавать значение в тик, как в примере
from encbutton.
Попробовал. Но похоже на ESP8266 именно виртуальные кнопки не работают.
То есть библиотека на ESP8266 нормально работает. Но я попробовал виртуальные кнопки и ничего не вышло. На вызове tick() происходит перезагрузка МК.
Или я не правильно код построил... Вот мой код:
#include <EncButton.h>
#include <PCF8574.h> // https://github.com/RobTillaart/PCF8574
#include <Wire.h>
EncButton<EB_TICK, VIRT_BTN> enc; // виртуальная кнопка
PCF8574 pcf20(0x20);
void setup() {
pcf20.begin();
}
void loop() {
bool state = pcf20.readButton(0);
enc.tick(!state);
}
На строке enc.tick(!state);
МК перезагружается.
from encbutton.
Всё замечательно работает на есп. Приведённый выше скетч даже не скомпилится, смотри примеры работы с PCF8574 в папке examples
from encbutton.
Я делал на основе https://github.com/RobTillaart/PCF8574/blob/master/examples/buttonRead/buttonRead.ino
куда еще проще. Вроде ничего не пропустил...
Даже строка enc.tick(0);
перезагружает МК. То есть без PCF8574.h
from encbutton.
повторюсь, у меня работает отлично)
Вроде ничего не пропустил...
Не вижу там this-> внутри скетча, это не будет компилиться
from encbutton.
from encbutton.
Приношу извинения, да, действительно, пример я привел странный.
Я подготовил точный пример из моего кода. Убрал все лишнее, оставил только расширитель, одну кнопку и EncButton. Симптомы проблемы правда другие. При старте в мониторе порта появляется следующее:
Start
Gamepad.isButtonPress(0)
Нажатия на кнопку ни к чему не приводят, хотя при нажатии должна появляться строка Gamepad.isButtonPress(0)
.
Вот код:
Файл main.cpp
:
#include "Gamepad.h"
Gamepad gamepad;
void setup() {
Serial.begin(9600);
Serial.println();
Serial.println("Start");
gamepad.begin();
}
void loop() {
gamepad.tick();
if (gamepad.isButtonPress()) {
Serial.println("Gamepad.isButtonPress");
}
}
Файл Gamepad.h
:
#pragma once
#include <Arduino.h>
#include <PCF8574.h> // https://github.com/RobTillaart/PCF8574
#include <EncButton.h>
class Gamepad {
public:
Gamepad();
void begin();
void tick();
bool isButtonPress();
private:
PCF8574 *pcf20 = nullptr;
EncButton<EB_TICK, VIRT_BTN> *button = nullptr;
};
Файл Gamepad.cpp
:
#include <Arduino.h>
#include "Gamepad.h"
Gamepad::Gamepad() {
this->pcf20 = new PCF8574(0x20);
this->button = new EncButton<EB_TICK, VIRT_BTN>;
}
void Gamepad::begin() {
this->pcf20->begin();
}
void Gamepad::tick() {
this->button->tick(!this->pcf20->readButton(0));
}
bool Gamepad::isButtonPress() {
return this->button->isPress();
}
from encbutton.
Ох, дичь какая. Не знаю насколько корректно будет работать динамическое создание шаблонного класса, не пробовал. Но по коду - readButton()
вызывается без указания пина, что судя по PCF8574.h вообще не должно компилироваться. Такое ощущение что меня опять обманывают :D
from encbutton.
Нет, этот код я отладил и залил в МК.
Нулик этот я пропустил тут, когда копировал в пост. Исправил выше и проверил еще раз.
from encbutton.
Ну дичь не дичь, но в реальных проектах будут классы. И создаваться объекты библиотеки будут по разному. Это уже не тестовый пример все-таки, это попытка написать более-менее полноценную игру. Я даже плату спаял для этого.
from encbutton.
Нда... Попробуй тогда сначала статически создать encbutton, если заработает - уже переходить на динаму и тысячу и один this->. Я ООП головного мозга не страдаю, возможно поэтому есть какие то недоработки в либе, ничего не могу сказать на этот счёт
from encbutton.
Попробовал статически. Работает. Правда не стабильно. В конце связь обрывается.
Start
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Gamepad.isButtonPress
Exception in thread rx:
Traceback (most recent call last):
File "C:\Users\khusamov\.platformio\python3\lib\threading.py", line 926, in _bootstrap_inner
self.run()
File "C:\Users\khusamov\.platformio\python3\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "c:\users\khusamov\.platformio\penv\lib\site-packages\serial\tools\miniterm.py", line 499, in reader
data = self.serial.read(self.serial.in_waiting or 1)
File "c:\users\khusamov\.platformio\penv\lib\site-packages\serial\serialwin32.py", line 295, in read
raise SerialException("GetOverlappedResult failed ({!r})".format(ctypes.WinError()))
serial.serialutil.SerialException: GetOverlappedResult failed (PermissionError(13, 'Отказано в доступе.', None, 5))
Файл main.cpp
:
#include "Gamepad.h"
Gamepad gamepad;
void setup() {
Serial.begin(9600);
Serial.println();
Serial.println("Start");
gamepad.begin();
}
void loop() {
gamepad.tick();
if (gamepad.isButtonPress()) {
Serial.println("Gamepad.isButtonPress");
}
}
Файл Gamepad.h
:
#pragma once
#include <Arduino.h>
#include <PCF8574.h> // https://github.com/RobTillaart/PCF8574
#include <EncButton.h>
class Gamepad {
public:
Gamepad();
void begin();
void tick();
bool isButtonPress();
private:
PCF8574 *pcf20 = nullptr;
EncButton<EB_TICK, VIRT_BTN> button;
};
Файл Gamepad.cpp
:
#include <Arduino.h>
#include "Gamepad.h"
Gamepad::Gamepad() {
this->pcf20 = new PCF8574(0x20);
}
void Gamepad::begin() {
this->pcf20->begin();
}
void Gamepad::tick() {
button.tick(!this->pcf20->readButton(0));
}
bool Gamepad::isButtonPress() {
return button.isPress();
}
from encbutton.
ошибка не выглядит как проблема с encbutton
from encbutton.
Какая? С обрывом связи? Да бог с ней. Главное - что делать с динамическим созданием объектов твоей библиотеки?
from encbutton.
Правда не стабильно. В конце связь обрывается.
Здесь тоже на encbutton подозрение? Или я не понял к чему вообще
from encbutton.
Правда не стабильно. В конце связь обрывается.
Здесь тоже на encbutton подозрение? Или я не понял к чему вообще
Пока нет подозрений. Просто она есть и она повторяется. Главное что нажатия фиксируются.
В общем я понял, динамическое создание объектов твоя библиотека не выдерживает. Пойду думать что с этим делать. Спасибо за отклик!
from encbutton.
Что значит "твоя библиотека не выдерживает"? Может питон не в состоянии правильно собрать прошивку или программист где то допускает ошибки?
Скетч
#define BTN_PIN 3
#include "lib.h"
Test test;
void setup() {
Serial.begin(9600);
pinMode(BTN_PIN, INPUT_PULLUP);
}
void loop() {
test.tick();
if (test.click()) Serial.println("click");
}
lib.h
#include <EncButton.h>
class Test {
public:
Test() {
btn = new EncButton<EB_TICK, VIRT_BTN>;
}
void tick() {
btn->tick(digitalRead(BTN_PIN));
}
bool click() {
return btn->isClick();
}
EncButton<EB_TICK, VIRT_BTN> *btn;
private:
};
from encbutton.
Спасибо! Все заработало!
В итоге скетч не менял свой, просто на 1001-й раз он просто заработал.
Правда при последущих разах загрузки скетча в МК, то работает, то не работает.
from encbutton.
Программирование это религия, чем больше бьешься лбом об пол и молишься, тем выше шанс что тот же код заработает))
from encbutton.
У меня есть подозрения, что я спаял плохо. Первая плата все-таки. USB например то пашет, то не пашет.
В общем спасибо! Главное я убедился, что со софтом все в порядке.
from encbutton.
Ура ура
from encbutton.
Related Issues (20)
- Добавить поддержку энкодера HOT 18
- Не работает на Arduino Nano 33 BLE HOT 36
- Опрос кнопок в момент перезагрузки устройства HOT 5
- Проект на wokwi с кнопками EncButton HOT 61
- Todo? HOT 8
- Migration from V2 to V3: tick() returns unreliable status HOT 5
- the 'eb.clear()' does not really set the encoder counter to 0 HOT 1
- Unusual step counting by rotary encoder HOT 5
- Многократное срабатывание виртуальной кнопки при однократном нажатии кнопки HOT 3
- fast() всегда false
- Ke-040 и 74hc165 HOT 9
- Совместимость с ESP8266 (Wemos D1 Mini) HOT 4
- Передать аргументы в событие. HOT 9
- 3.5.1 Won't compile HOT 1
- Описка в README HOT 1
- Внутрення подтяжка пинов INPUT_PULLUP HOT 13
- Невозможно использовать библиотеку после обновления до 3.5.9 HOT 2
- Иногда нет обработки вращения энкодера HOT 1
- Добавить возможность игнорирования событий до спуска кнопки HOT 14
- Ер
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from encbutton.