PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Дополнительные устройства (http://pccar.ru/forumdisplay.php?f=177)
-   -   Резистивные кнопки под андроид (http://pccar.ru/showthread.php?t=18478)

НСО154 15.08.2018 21:14

Цитата:

Сообщение от Vladget (Сообщение 404808)
А там разве напряжения? там же вроде сопротивление относительно массы

Микропроцессор-то реагирует на напряжение, которое задаётся сопротивлением)
Правильней говорить о напряжении, которые протекает через кнопки на микропроцессор, ну а первое зависит от сопротивления.

Vladget 15.08.2018 21:30

А откуда там напряжение если один конец сопротивления на массе? А вот кусочек текста по твоей ссылке "Контроллер Arduino постоянно считывает это сопротивление" и судя по скетчу
"
if (c<500)
{
b=1; // button 1 pressed "Трек вперед"
"
в данном случае это как раз 0,43К так что меряется сопротивление

НСО154 15.08.2018 21:37

Цитата:

Сообщение от Vladget (Сообщение 404808)
А там разве напряжения? там же вроде сопротивление относительно массы

Естественно)
А что там ещё может быть?
Кнопка замыкает цепь, на ней напряжение заданное сопротивлением.
На кнопке в отжатом состоянии, естественно логический "0"

НСО154 15.08.2018 21:50

Цитата:

Собственно измерение напряжение на входах производится аналого-цифровым преобразователем (АЦП) с коммутатором на 6 каналов. АЦП имеет разрешение 10 бит, что соответствует коду на выходе преобразователя 0…1023. Погрешность измерения не более 2 единиц младшего разряда.

Для сохранения максимальной точности (10 разрядов) необходимо, чтобы внутреннее сопротивление источника сигнала не превышало 10 кОм. Это требование особенно важно при использовании резисторных делителей, подключенных к аналоговым входам платы. Сопротивление резисторов делителей не может быть слишком большим.

Программные функции аналогового ввода.

int analogRead(port)

Считывает значение напряжения на указанном аналоговом входе. Входное напряжение диапазона от 0 до уровня источника опорного напряжения (часто 5 В) преобразовывает в код от 0 до 1023.

При опорном напряжении равном 5 В разрешающая способность составляет 5 В / 1024 = 4,88 мВ.

Занимает на преобразование время примерно 100 мкс.

int inputCod; // код входного напряжения
float inputVoltage; // входное напряжение в В

inputCod= analogRead(A3); // чтение напряжения на входе A3
inputVoltage= ( (float)inputCod * 5. / 1024. ); // пересчет кода в напряжение (В)
Почитай

Vladget 15.08.2018 22:00

применительно к этому скетчу что такое с<500 --- 500 чего?

НСО154 15.08.2018 22:20

Цитата:

Сообщение от Vladget (Сообщение 404814)
применительно к этому скетчу что такое с<500 --- 500 чего?

"С"-это заданный аналоговый вход
"500"-это напряжение заданное резистором на кнопке.

Vladget 15.08.2018 22:35

ну может быть, ( я не спорил я спрашивал) так и все таки 500 это чего, если там макс 5В то 500 чего

НСО154 15.08.2018 22:48

Цитата:

Сообщение от Vladget (Сообщение 404817)
ну может быть, ( я не спорил я спрашивал) так и все таки 500 это чего, если там макс 5В то 500 чего

Выделил)
V
Цитата:

Собственно измерение напряжение на входах производится аналого-цифровым преобразователем (АЦП) с коммутатором на 6 каналов. АЦП имеет разрешение 10 бит, что соответствует коду на выходе преобразователя 0…1023. Погрешность измерения не более 2 единиц младшего разряда.

Для сохранения максимальной точности (10 разрядов) необходимо, чтобы внутреннее сопротивление источника сигнала не превышало 10 кОм. Это требование особенно важно при использовании резисторных делителей, подключенных к аналоговым входам платы. Сопротивление резисторов делителей не может быть слишком большим.

Программные функции аналогового ввода.

int analogRead(port)

Считывает значение напряжения на указанном аналоговом входе. Входное напряжение диапазона от 0 до уровня источника опорного напряжения (часто 5 В) преобразовывает в код от 0 до 1023.

При опорном напряжении равном 5 В разрешающая способность составляет 5 В / 1024 = 4,88
мВ.

Занимает на преобразование время примерно 100 мкс.

int inputCod; // код входного напряжения
float inputVoltage; // входное напряжение в В

inputCod= analogRead(A3); // чтение напряжения на входе A3
inputVoltage= ( (float)inputCod * 5. / 1024. ); // пересчет кода в напряжение (В)
500-это приблизительно 2.4в

Jeni_ 16.08.2018 01:57

Цитата:

Сообщение от Vladget (Сообщение 404803)
Ну уже ближе, Осталось объяснить как связан пионер с тв-боксом (еще неплохо бы определиться с марками как пионера так и тв бокса), и еще ты кнопки с пионера уберешь и подключишь к тв боксу или они (кнопки) должны и пионером управлять и тв боксом?

может тебе надо к юрию с его адаптером

TV BOX на android, работает через AV вход.
Если переключить на AV, из кнопок на руле работает только мод и звук - +
как раз то что нужно.
То есть TV BOX управление подключить параллельно, не в разрыв.

Vladget 16.08.2018 10:27

а что происходит если нажать "след трек" или "пред..." когда работает тв бокс ?- что то происходит , и можно марку твбокса - на нем что есть кнопки? или как думаешь переключать "след - пред"

Jeni_ 16.08.2018 11:51

Помогите пожалуйста подкорректировать этот скеч
Мне необходимо задействовать два входа, A0 и A1

int analogPin=A0;
int data;
int data1 = 0;
int flag = 0;
unsigned long eventTime = 0;

void setup()
{
Serial.begin(9600);
digitalWrite(analogPin, HIGH);
}

void loop()
{
data=analogRead(analogPin);

if(data>=950 && data1 != 0 && flag <= 1)
{
Serial.print(" Serial.print(data1);
Serial.print(">");
data1 = 0;
flag = 0;
delay(10);
}

if(data>=950)
{
eventTime = millis();
}

if(data<=949 && flag != 1 && millis()-eventTime>=50 && millis()-eventTime<=800)
{
flag = 2;
if(millis()-eventTime <= 60) data1 = data;
}

if(data>=950 && flag == 2)
{
Serial.print(" Serial.print(data1);
Serial.print(">");
flag = 0;
delay(10);
}

if(data<=949 && flag == 2 && millis()-eventTime>800)
{
Serial.print(" Serial.print(data);
Serial.print(">");
data1 = data;
flag = 1;
delay(10);
}
}

Jeni_ 17.08.2018 03:48

:wacko2:

НСО154 17.08.2018 09:01

Теперь хоть понятно, что тебе нужно)
Вопрос.
Что конкретно нужно передавать по последовательному порту в ТВ-бокс?

Jeni_ 17.08.2018 09:55

Цитата:

Сообщение от НСО154 (Сообщение 404846)
Теперь хоть понятно, что тебе нужно)
Вопрос.
Что конкретно нужно передавать по последовательному порту в ТВ-бокс?

Мне надо привязать на А1 Кнопку "Back".
На А0 будут кнопки , next, play, mode, но эти кнопки настраиваются утилитой ,без проблем.

НСО154 17.08.2018 15:50

Цитата:

Сообщение от Jeni_ (Сообщение 404847)
Мне надо привязать на А1 Кнопку "Back".
На А0 будут кнопки , next, play, mode, но эти кнопки настраиваются утилитой ,без проблем.

Ну допустим привяжем.
Будут кнопки "кидать" что-нибудь на аналоговые входы.
Дальше что делать с тем что они накидают?)))

Vladget 17.08.2018 16:09

да нет ему нужно тупо замкнуть контакты этих кнопок на твбоксе, а тут наверно сразу вопрос что на этих кнопках ? или надо ставить два реле которые бы тупо щелкали. и наверно еще вопрос возникнет , я его задал но .. так как это будет параллельно с ГУ и при этом от него ничего не отключается что будет если когда работает твбокс нажимать эти две кнопки - на ГУ ничего не происходит? и наоборот если работает ГУ без тв бокса а ты нажимаешь эти кнопки что будет делать тв бокс в фоновом режиме , где он будет когда ты его подключешь в ГУ

НСО154 17.08.2018 16:14

А вот судя по примеру выложенного им скетча, получается следующие.
Читаем с аналогового входа --->отправляем полученное на тв-бокс по USB.
Все.

Короче голова уже разболелась...пусть мысли свои в порядок приведёт)

Vladget 17.08.2018 16:30

он же писал
"Мне надо привязать на А1 Кнопку "Back".
На А0 будут кнопки , next, play, mode, но эти кнопки настраиваются утилитой ,без проблем."

ну пошлешь ты что то на USB а кто там что то ждет
я же писал ему напиши марки и ГУ и бокса хоть посмотрели бы что есть что .

а скетч он просто что то подправил не вдаваясь откуда и куда

Jeni_ 18.08.2018 12:59

Цитата:

Сообщение от Vladget (Сообщение 404857)
он же писал
"Мне надо привязать на А1 Кнопку "Back".
На А0 будут кнопки , next, play, mode, но эти кнопки настраиваются утилитой ,без проблем."

ну пошлешь ты что то на USB а кто там что то ждет
я же писал ему напиши марки и ГУ и бокса хоть посмотрели бы что есть что .

а скетч он просто что то подправил не вдаваясь откуда и куда

Все верно. Все что мне надо, это в скетче прописать второй вход А1 или А2 не важно. но я не пойму как. (((

Vladget 18.08.2018 15:22

короче ему надо скетч который бы считывал только две кнопки "след трек" "пред трек" и в случае нажатия их на выходе включал бы то ли первое реле то ли второе контакты которых он припаяет тупо к кнопкам тв бокса

НСО154 18.08.2018 17:14

Цитата:

Сообщение от Vladget (Сообщение 404869)
короче ему надо скетч который бы считывал только две кнопки "след трек" "пред трек" и в случае нажатия их на выходе включал бы то ли первое реле то ли второе контакты которых он припаяет тупо к кнопкам тв бокса

Вспомнил игру из 90-х "Что, Где, Когда"
))))))))))
Кстати, если тему почитать, то можно собрать полноценный контроллер резистивных кнопок)

jonikus81 19.08.2018 17:19

Всем привет.
Я один такой счастливчик у которого комманды
Remote.rewind();
Remote.forward();
в винде 10 вообще не пашут, а на андройде тупо переключают треки (как некст и превьюс)?
Кстати с библиотекой Tablet такая же балалайка.
IDE 1.0.5

НСО154 19.08.2018 18:24

Цитата:

Сообщение от jonikus81 (Сообщение 404893)
Всем привет.
Я один такой счастливчик у которого комманды
Remote.rewind();
Remote.forward();
в винде 10 вообще не пашут, а на андройде тупо переключают треки (как некст и превьюс)?
Кстати с библиотекой Tablet такая же балалайка.
IDE 1.0.5

Бывает))

jonikus81 20.08.2018 12:47

Цитата:

Сообщение от НСО154 (Сообщение 404894)
Бывает))

обидно то, что раньше (с год назад) не было самого устройства и я все делал на макетке и все работало как часики, даже для компа хотел собрать пультик. Потом нашел улитку на руль и сам руль под улитку. Тут появилось время и я собрал само устройство на руль как и хотел, дошло дело до тестов в авто и тут "такое". Такое лечится?

kastava 08.11.2018 13:22

Цитата:

Сообщение от lti1 (Сообщение 319975)
Соберу всю информацию по одному из решений в одном месте, у кого есть возможность закрепите ссылку в первом сообщении.
Работает только с Arduino Pro Micro и Arduino Leonardo на чипе ATmega32u4.
Для начала меняем в папке \arduino-1.0.5\hardware\arduino\cores\arduino для IDE 1.0.5 или \arduino-1.6.5-r5\hardware\arduino\avr\cores\arduino для IDE 1.6.5 меняете два файла USBAPI.h, HID.cpp на те, что во вложении этого сообщения, при этом версия ПО Arduino Software IDE должна быть 1.0.5, скачать setup exe, скачать zip ИЛИ 1.6.5, на других не проверял.
После заливаете этот скетч и считайте коды всех кнопок через "монитор порта" Arduino Software (IDE).
PHP код:

int analogPin=0//пин для подключения кнопок
int data;

void setup()
{
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Serial.begin(9600);
}

void loop()
{
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data);
delay(1000);


Подключаете кнопки к Arduino по следующим схемам, с подтяжкой к - или к +. Номинал сопротивления ~20 кОм.
Вложение 38555
Потом заливаете этот скетч, только в начале скетча указываете свои значения, то есть вместо 111, 222, 333, 444, 555, 777 указываете значения своих кнопок, а также значение при отпущенных кнопках, в зависимости от схемы подключения будут либо ближе 0 либо ближе к 1023:
PHP код:

//****************** Здесь необходимо указать свои значения *************** 

int analogPin=0// пин для подключения кнопок, по умолчанию A0 

int release_button 1023// значение при отпущенных кнопках 
int button_release_range 50// диапазон значения + - при отпущенных кнопках 
int button_range 5// диапазон значения нажатых кнопок + - 
int time_holding 500// время для удержания кнопок в миллисекундах 
int time_tinkling 30// время исключающее дребезг контактов в миллисекундах 
int vol_up 111// значение кнопки увеличить громкость 
int vol_down 222// значение кнопки уменьшить громкость 
int alt_tab 333// значение кнопки которая будет работать как Alt + Tab 
int next 444// значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании 
int previous 555// значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании 
int play_pause 777// значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании 

//************************************************************************** 

int data;  
unsigned long flag 0;  
unsigned long eventTime 0;  
unsigned long pauseMillis 0

void setup()  

analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение) 
Keyboard.begin();  
}  

void loop()  
{  
data=analogRead(analogPin);  
if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 0)  
{  
eventTime=millis();  
}  

//********************** Громкость ************************************ 

if(millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= vol_up button_range && data <= vol_up button_range && flag == 0
{   
Remote.increase();  
flag 5;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= vol_up button_range && data <= vol_up button_range && flag == || data >= vol_up button_range && data <= vol_up button_range && flag && flag == 3)  
{   
Remote.increase(); 
flag 3;  
Remote.clear();  
delay(100);  
}  

if(
millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= vol_down button_range && data <= vol_down button_range && flag == 0)  
{   
Remote.decrease();  
flag 6;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= vol_down button_range && data <= vol_down button_range && flag == || data >= vol_down button_range && data <= vol_down button_range && flag == 3)  
{   
Remote.decrease();  
flag 3;  
Remote.clear();  
delay(100);  
}  

//********************** AltTab + Ещё что то ************************************   

if(millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= alt_tab button_range && data <= alt_tab button_range)  
{   
flag 1;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == && pauseMillis == 0)  
{  
Keyboard.press(KEY_LEFT_ALT);  
Keyboard.press(KEY_TAB);  
Keyboard.release(KEY_TAB);  
Keyboard.press(KEY_TAB);  
Keyboard.release(KEY_TAB);  
flag 0;  
pauseMillis millis();  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == && pauseMillis != 0)  
{  
Keyboard.press(KEY_TAB);  
Keyboard.release(KEY_TAB);  
flag 0;  
pauseMillis millis();  
}  

if(
pauseMillis && millis()-pauseMillis >= 800 && data>=release_button button_release_range && data<=release_button button_release_range)  
{  
flag 0;  
pauseMillis 0;  
Keyboard.releaseAll();  
}  

if(
millis()-eventTime>time_holding && data >= alt_tab button_range && data <= alt_tab button_range && flag == 1)  
{   
flag 0;  
}  
//********************** Next и Fast Forward ************************************   

if(millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= next button_range && data <= next button_range)  
{   
flag 2;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 2)  
{  
Remote.next();  
flag 0;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= next button_range && data <= next button_range && flag == || data >= next button_range && data <= next button_range && flag == 3)  
{   
Remote.forward();  
flag 3;  
Remote.clear();  
delay(100);  
}  
//********************** Previous и Rewind ************************************   

if(millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= previous button_range && data <= previous button_range)  
{   
flag 4;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 4)  
{  
Remote.previous();  
flag 0;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= previous button_range && data <= previous button_range && flag == || data >= previous button_range && data <= previous button_range && flag == 3)  
{   
Remote.rewind(); 
flag 3;  
Remote.clear();  
delay(100);  
}  

//********************** Play/pause + Mute ************************************   

if(millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= play_pause button_range && data <= play_pause button_range)  
{   
flag 7;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 7)  
{  
Remote.play_pause();   
flag 0;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= play_pause button_range && data <= play_pause button_range && flag == 7)  
{   
Remote.mute(); 
flag 0
delay(10); 
Remote.clear();  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == || data>=release_button button_release_range && data<=release_button button_release_range && flag == || data>=release_button button_release_range && data<=release_button button_release_range && flag == 6)  
{  
flag 0;  
}   


Алгоритм работы такой: короткое нажатие, более 10 (int time_tinkling = 10; можно менять в скетче) и менее 500 миллисекунд (int time_holding = 500; можно менять в скетче) - Play/pause; длинное, более 500 миллисекунд (int time_holding = 500; можно менять в скетче) - Mute.
Тоже самое с Next и Fast Forward, Previous и Rewind. При удержании увеличения и уменьшения громкости, увеличивает или уменьшает громкость на 10 делений в секунду, а при коротком нажатии, менее 500 миллисекунд - увеличивает или уменьшает громкость на 1 деление.
Alt + Tab, при первом нажатии эмулирует Alt и два раза Tab, то есть переходит предыдущему открытому приложении и в течении 0,8 секунды удерживает Alt, а повторные нажатия на кнопку в течении этого времени эмулируют только Tab. На удержание ни чего не назначен, можно добавить при необходимости.

Подскажите возможно ли к этому скетчу добавить кнопки HOME, POWER, F1,F2,F3 ? Если да то поделитесь инфой что нужно изменить

fishdimka 18.12.2018 13:57

имеется магнитола на андройд, два энкодера и arduino pro micro
первый энкодер нажатие - "Enter", вращение просто -"Tab"
второй энкодер нажатие - "Alt+Tab" , вращение - "громкость"
подскажите пожалуйста как реализовать скетч и подключение к ардуино?

oleg707 18.12.2018 22:12

Цитата:

Сообщение от fishdimka (Сообщение 407221)
имеется магнитола на андройд, два энкодера и arduino pro micro
первый энкодер нажатие - "Enter", вращение просто -"Tab"
второй энкодер нажатие - "Alt+Tab" , вращение - "громкость"
подскажите пожалуйста как реализовать скетч и подключение к ардуино?

Если подключить юсб клавиатуру к магнитоле и эти комбинации работают, то прошиваете промикру как юсб клавиатуру, на энкодеры подтяжки и конденсаторы по 0.1 мФ и скетч написать. Примеры скетча есть прямо в Ардуино IDE (среде разработки)

skanch 18.12.2018 22:32

Цитата:

Сообщение от fishdimka (Сообщение 407221)
...подскажите пожалуйста как реализовать скетч и подключение к ардуино?

Посмотрите здесь...
http://www.pccar.ru/showpost.php?p=390834&postcount=95
http://pccar.ru/showpost.php?p=319975&postcount=307

Alex15BV 20.12.2018 17:43

Доброго времени суток Всем!

Подскажите, пожалуйста, чайнику:
- подключил энкодер к Ардуино ПроМикро
- залил свой коротенький скетчик на основе библиотеки Remote
- под Windows все работает норм (уменьшает/прибавляет громкость, отключает/включает звук), в диспетчере определяется как "HID-совместимое устройство управления" и "USB-устройство ввода"
- на Андроиде - ВООБЩЕ ТИШИНА (то есть никакой реакции ни на подключение, ни на манипуляции)
Что может быть? Может в системные папки нужно что-то добавить, в buildprop что-то прописать?
Андроид-одноплатник Khadas VIM2. Спасибо за ответы!

oleg707 20.12.2018 19:59

Цитата:

Сообщение от Alex15BV (Сообщение 407291)
Доброго времени суток Всем!

Подскажите, пожалуйста, чайнику:
- подключил энкодер к Ардуино ПроМикро
- залил свой коротенький скетчик на основе библиотеки Remote
- под Windows все работает норм (уменьшает/прибавляет громкость, отключает/включает звук), в диспетчере определяется как "HID-совместимое устройство управления" и "USB-устройство ввода"
- на Андроиде - ВООБЩЕ ТИШИНА (то есть никакой реакции ни на подключение, ни на манипуляции)
Что может быть? Может в системные папки нужно что-то добавить, в buildprop что-то прописать?
Андроид-одноплатник Khadas VIM2. Спасибо за ответы!

Питание на юсб есть? Флешку видит? Клавиатуру видит?

svoboda120 20.12.2018 20:16

Цитата:

Сообщение от Alex15BV (Сообщение 407291)
Что может быть? Может в системные папки нужно что-то добавить, в buildprop что-то прописать?

У вас что то не так с режимом ОТГ. Посмотрите эту статью. В ней автор описывает прошивку для вашего девайса и одним из преимуществ этой прошивки считает "— разъем microUSB type-C активирован в режим OTG, теперь можно в него подключать устройства". Возможно подтолкнет вас на какие то мысли.

Alex15BV 22.12.2018 16:59

Доброго времени суток Всем.
Дико извиняюсь... А никто не думал над упрощением обсуждаемого кода? (Над избыточностью переменных и сложностью логических конструкций при проверке)
... или это не нужно никому? Работает, и ладно...

Пример:
зачем сначала "vol_up = 111", потом к этому "button_range = 5"
и потом к этому ещё "data >= vol_up - button_range && data <= vol_up + button_range"

когда можно "vol_up_porog = 120" и затем "data < vol_up_porog"
и к тому же эту переменную можно потом использовать в loop для однозначной идентификации нажатой кнопки (в качестве флага)...

fishdimka 12.01.2019 14:35

задача:
-при повороте энкодера по часовой стрелке срабатывала кнопка "стрелка вправо" KEY_RIGHT_ARROW
-при повороте против часовой "стрелка влево" KEY_LEFT_ARROW
-при нажатии энкодера Enter "KEY_RETURN"
собрал скетч,
работает только нажатие энкодера Enter "KEY_RETURN"
если не чего не трогаешь просто перелистываются приложения, как будто нажата клавиша "стрелка вправо" KEY_RIGHT_ARROW

подключил так:
pin 16 кнопка энкодера SW
pin 2 нога энкодера CLK
pin 3 нога энкодера DT
GDN средняя нога энкодера и с кнопки GDN

подскажите, что нужно поправить в скетче или что переподключить?

скетч
#include
#include
#include
#include
#define BTN_pin 16 // pin 16 кнопка энкодера SW
const int pin_A = 2; // pin 2 нога энкодера CLK
const int pin_B = 3; // pin 3 нога энкодера DT
unsigned char encoder_A; //переменная
unsigned char encoder_B; //переменная
unsigned char encoder_A_prev=0; //переменная


uint32_t vibor = 0; //Здесь будем хранть время
int perek = 0; //переменная переключатель

void setup() {
digitalWrite(BTN_pin, 1); //подтяжка кнопки энкодера
pinMode(pin_A, INPUT); //пины энкодера объявляем входами
pinMode(pin_B, INPUT); //пины энкодера объявляем входами
Serial.begin(9600);
Keyboard.begin(); //подключим как клава
}
void loop()
{
//////////////ЭНКОДЕР///////////
{ encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
Keyboard.press(KEY_RIGHT_ARROW);
delay(200);
Keyboard.releaseAll();
}
else {
Keyboard.press(KEY_LEFT_ARROW);
delay(200);
Keyboard.releaseAll();
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
}

if(digitalRead(BTN_pin)==LOW) //Если кнопка нажата то делаем то что ниже.
{
Keyboard.press(KEY_RETURN); //При нажатии на кнопку команда Enter
delay(200); //Делаем небольшую задержку чтоб не засыпало командами.
Keyboard.releaseAll();
}
}

Alex15BV 12.01.2019 15:34

После комментария "//////////////ЭНКОДЕР///////////" открывающая скобка не лишняя, случайно? (перед encoder_A = digitalRead(pin_A);)

... И инклюды лишние: если используются только функции клавиатуры - то зачем подключать ещё и Tablet, и Encoder?

Alex15BV 12.01.2019 16:01

Цитата:

Сообщение от fishdimka (Сообщение 407857)
задача:
-при повороте энкодера по часовой стрелке срабатывала кнопка "стрелка вправо" KEY_RIGHT_ARROW
-при повороте против часовой "стрелка влево" KEY_LEFT_ARROW
-при нажатии энкодера Enter "KEY_RETURN"

Я в Ардуино чайник, но сделал себе - и работает, как часики: и переключение режимов работы, и длительбность нажатия) :blush:
Сделал на прерываниях (здесь кусок, касающийся только энкодера):
PHP код:

#include <Mouse.h>
#include <Keyboard.h>
#include <Tablet.h>

#define KeyEncPin 2     // кнопка энкодера
#define EncAcPin 3      // энкодер - канал А
#define EncBcPin 5      // энкодер - канал В

volatile boolean RightMove false;   // направления вращения энкодера
volatile boolean LeftMove false;    
volatile boolean EncPress false;    // нажатия кнопки энкодера

// ----- обработчики прерываний -------

void EncoderMove() {                     // вращение энкодера
  
if (digitalRead(EncBcPin) == HIGH) {
    
RightMove true;
  }
  else {
    
LeftMove true;
  }
}

void KeyEncPress() {        // кнопка энкодера
  
EncPress true;
}

void setup() {
  
pinMode(KeyEncPinINPUT_PULLUP);                                           // кнопка энкодера - при нажатии PLAY/PAUSE либо ENTER/ESCAPE
  
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPressFALLING);
  
pinMode(EncAcPinINPUT_PULLUP);                                            // канал-А энкодера - для отслеживания вращения
  
attachInterrupt(digitalPinToInterrupt(EncAcPin), EncoderMoveFALLING);
  
pinMode(EncBcPinINPUT_PULLUP);                                            // канал-В энкодера - для определения направления вращения
  
pinMode(LedPinOUTPUT);

  
Serial.begin(9600);                 // инициализация интерфейсов
  
Keyboard.begin();
  
Mouse.begin();
  
delay(500);
}

void loop() {
  if (
RightMove == true) {             // обработка вращения энкодера: если вращаем вправо - увеличить громкость/стрелка вверх
    
if (MediaMode == true) {
      
Tablet.vol_up();
      
Tablet.clear();
    }
    else {
      
Keyboard.press(KEY_UP_ARROW);
      
delay(10);
      
Keyboard.release(KEY_UP_ARROW);
    }
    
RightMove false;
  }

  if (
LeftMove == true) {               // если вращаем влево - уменьшаем громкость/стрелка вниз
    
if (MediaMode == true) {
      
Tablet.vol_down();
      
Tablet.clear();
    }
    else {
      
Keyboard.press(KEY_DOWN_ARROW);
      
delay(10);
      
Keyboard.release(KEY_DOWN_ARROW);
    }
    
LeftMove false;
  }

  if (
EncPress == true) {                       // обнаружили факт нажатия кнопки энкодера - определяем длительность нажатия и запоминаем кнопку
    
delay(20);
    while (
digitalRead(KeyEncPin) == LOW) {     // пока не отпустим -
      
TimePress millis() - EventStart;        // считаем время нажатия
      
delay(10);
    }
    
KeyNumber 1;                              // сохраняем номер нажатой кнопки для обработчика
    
EncPress false;                           // сбрасываем флаг нажатия
    
NeedWork 1;                               // взводим флаг необходимости обработки нажатия
    
if (TimePress <= 400) {                     // сохраняем длительность нажатия
      
ShortKey 1;
    }
    else {
      
ShortKey 0;
    }
  }
...



fishdimka 12.01.2019 20:49

скетч не компилируется, ругается на эту строку
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPress, FALLING);

Alex15BV 12.01.2019 20:58

Arduino ProMicro - забыл указать... Не знаю, на чем ты делаешь

fishdimka 12.01.2019 21:00

на Arduino ProMicro делаю

Alex15BV 12.01.2019 21:07

Нет проблем никаких :blush:

fishdimka 12.01.2019 21:19

можешь прислать весь скетч целяком
https://cloud.mail.ru/public/Hdfc/U5ENixwV5


Часовой пояс GMT +4, время: 13:15.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot