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

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

uncann 10.01.2017 08:10

Ну и имеется в виду спать, просто это же кнопка "power" :)
Вот как в скрипте на 6-ой странице, строка которая не проходит компиляцию:

if (data>=140 && data<=150) // спать
{
Remote.power();
Remote.clear();
}

lti1 10.01.2017 09:03

Цитата:

Сообщение от uncann (Сообщение 379388)
Ну и имеется в виду спать, просто это же кнопка "power" :)
Вот как в скрипте на 6-ой странице, строка которая не проходит компиляцию:

if (data>=140 && data<=150) // спать
{
Remote.power();
Remote.clear();
}

http://pccar.ru/showthread.php?p=277286#post277286

uncann 11.01.2017 19:01

Не, файлики то поменяны, но заменил попробовать из тех что по ссылке - все равно так же 'class Remote_' has no member named 'power' :(

uncann 12.01.2017 19:03

О! Победил :)
Оказывается надо так:
Remote.power();
Remote.clear();
То есть "Power" надо с маленькой буквы! С чего бы ради - непонятно, но так скомпилировалось.

T0xa 01.03.2017 11:13

Всем привет! Стоит задача рулить цифровым потенциометром используя энкодер. Написал скетч - залил в Arduino Uno, подтянул пины по питанию через встроенные резисторы. Все работает и регулируется. НО после того как перенес этот скетч на Pro Mini 3.3V 8Mhz, то появился глюк - вращаешь энкодер в любую сторону а он циклично меняет значение сначала до минимума а потом до максимума (либо наоборот, смотря в какую сторону крутить). Попробовал переписать скетч под библиотеку Encoder.h, но в результате все повторяется. На Uno работает как должно, а на Pro Mini циклично меняет значение, как будто энкодер попеременно вращаешь в разные стороны. Возможно где-то по схемотехнике чего-то надо добавить? В общем, прошу помощи.

skanch 01.03.2017 16:23

Я нисколько не программист, но пользуюсь таким скетчем в своих поделках. Связка: энкодер+ProMini 5V 16Mhz работает нормально.

T0xa 01.03.2017 19:14

Цитата:

Сообщение от skanch (Сообщение 383162)
Я нисколько не программист, но пользуюсь таким скетчем в своих поделках. Связка: энкодер+ProMini 5V 16Mhz работает нормально.

Благодарю, но на мой взгляд слишком громоздко. Нашел решение своей проблемы - подтянул пины по питанию через внешние резисторы 10 кОм и для надежности добавил конденсаторы 0.1 мкф. Все пришло в норму :smile2:

skanch 01.03.2017 19:22

Цитата:

Сообщение от T0xa (Сообщение 383173)
... Нашел решение своей проблемы - подтянул пины по питанию через внешние резисторы 10 кОм и для надежности добавил конденсаторы 0.1 мкф. Все пришло в норму :smile2:

Все оказалось куда проще, чем я мог предположить... Удачи в проекте!

Las42kuz 10.08.2017 20:50

Здравствуйте делаю планшет в машину! Остановился на подключении кнопок на руле точнее я подключил ардуйно про микро и кнопки но сейчас решил добавить энкодер и теперь не знаю как объединить два сетча помогите пожалуйста , сам не осилю! По отдельности все работает! Заранее спасибо

это для энкодера
[PHP]#define BTN_pin 8 // pin 8 кнопка энкодера SW
const int pin_A = 10; // pin 10 нога энкодера CLK
const int pin_B = 9; // pin 9 нога энкодера 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); //пины энкодера объявляем входами
Keyboard.begin(); //подключим как клава
}
void loop()
{

{ encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
Remote.increase(); //отправляем команду громкость выше
Remote.clear(); //очищаем команду
}
else {
Remote.decrease(); //отправляем команду громкость ниже
Remote.clear(); //очищаем команду
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
}
if(digitalRead(BTN_pin)==LOW) //Если кнопка нажата то делаем то что ниже.
{
Keyboard.press(KEY_LEFT_ALT); //нажмем кнопку ALT
Keyboard.press(KEY_TAB); //нажмем кнопку TAB
Keyboard.release(KEY_TAB); //отпустим кнопку TAB
delay(150); //ждем 150мс чтоб не скакало по окошкам
vibor = millis(); //запускаем отсчет времени
perek=1; //переменной переключателя присваиваем 1
}
if((vibor && millis()-vibor > 1000) && perek==1) //если прошло больше 1 секунды и перемменая переключателя = 1
{
Keyboard.releaseAll(); //отпускаем все кнопки
perek = 0; //переменной переключателя присваиваем 0 чтоб сюда больше не заходил
}
}
/PHP]
для кнопок на руль

[PHP]int rknop; // это переменная которая хранит значения наших кнопок.
void setup()
{
Serial.begin(9600); //это скорость соединения с компьютером (для сериал монитора в нашем случае)

pinMode(rknop,INPUT);
}

void loop()
{
rknop=analogRead(A0); //Считываем значения на порту A0 и записываем значения в переменную rknop
Serial.println(rknop); //Отправляем данные переменной rknop на компьютер
delay(200); //небольшая задержка в пол секунды, её можно удалить но значения в сериал мониторе будет меняться очень быстро

///////////////////////////////////////////
if(rknop < 969 && rknop > 966) //здесь мы делаем условие. Т.е если у наз значение переменной rknop больше 900 и меньше 960 то делаем какоето действие которая ниже. На сколько мы помним при нажатии кнопки S1 у нас значения были ~930 так вот мы могли написать просто if(rknop == 930) что означает если rknop равно 930 то делем дейсвие которое ниже, но наши значения немного игрют поэтому мы задаем никий промежуток от 900 до 960
{
Remote.next(); //отправляем команду следующая песня
delay(200); //делаем небольшую задержу чтоб устройство успело отправить необходимые команды на планшет или компьютер и не засыпать его командами
Remote.clear();//очищаем команду
}

////////////////////////////////////////////
if(rknop < 994 && rknop > 992)
{
Remote.previous(); //предыдущая песня
delay(200);
Remote.clear();
}

////////////////////////////////////////////
if(rknop < 927 && rknop > 925)
{
Remote.play_pause(); //плей и паузу
delay(200);
Remote.clear();
}

////////////////////////////////////////////
if(rknop < 1009 && rknop > 1007)
{
Remote.increase(); //громкость прибавить
delay(000);
Remote.clear();
}

////////////////////////////////////////////
if(rknop < 1019 && rknop > 1015)
{
Remote.decrease(); //громкость убавить
delay(000);
Remote.clear();
}/PHP]

jonikus81 11.08.2017 07:16

Las42kuz, как оно могло у Вас работать, если не хватает библиотек в обоих скетчах и желательно ссылку на них ибо стандартные не работают.

Las42kuz 11.08.2017 08:43

Цитата:

Сообщение от jonikus81 (Сообщение 390812)
Las42kuz, как оно могло у Вас работать, если не хватает библиотек в обоих скетчах и желательно ссылку на них ибо стандартные не работают.

Я в этом не силен делал все по урокам на youtube по отдельности и энкодер и кнопки на руле работают :
https://yadi.sk/d/YrXiZwyB3Ltp8P
https://yadi.sk/d/1N16cgDh3Ltp7Y

Las42kuz 11.08.2017 09:13

Цитата:

Сообщение от jonikus81 (Сообщение 390812)
Las42kuz, как оно могло у Вас работать, если не хватает библиотек в обоих скетчах и желательно ссылку на них ибо стандартные не работают.

https://yadi.sk/d/hGU3nP4w3LtqKZ

jonikus81 11.08.2017 12:23

https://yadi.sk/d/gjjMKyYZ3Lu7iB
пробуйте, так как все железки дома, протестировать не могу

Las42kuz 11.08.2017 12:46

Цитата:

Сообщение от jonikus81 (Сообщение 390821)
https://yadi.sk/d/gjjMKyYZ3Lu7iB
пробуйте, так как все железки дома, протестировать не могу

попробовал работает но жутко тормозит само нажатие кнопок и энкодера

lti1 12.08.2017 01:17

Las42kuz, пробуйте. Схема подключения резистивных кнопок здесь.
PHP код:

/*
вывод 1 энкодера к выводу 3 ардуино
вывод 2 энкодера к выводу 4 ардуино
общий вывод энкодера к выводу GND ардуино
резестивные кнопки к выводу A0 ардуино
*/
//****************** Здесь необходимо указать свои значения ***************

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

/* возможные действия
vol_up_action()    Увеличить громкость
vol_down_action() Уменьшить громкость
next_action()   Следующий трек
forward_action()  Предыдущий трек
previous_action() Перемотка вперед
rewind_action()   Перемотка назад
play_pause_action() Play/Pause
mute_action()   Приглушение звука
alt_tab_action()  Alt + Tab
home_action()   Переход на домашний экран
play_action()   Play
pause_action()    Pause
stop_action()   Stop
power_action()    Питание (Включить или выключить экран)
mouse_wheel_up()  Вращение колеса мыши от себя
mouse_wheel_down()  Вращение колеса мыши на себя
*/
// только на кнопках 1-4 при удержании действие повторяется 10 раз в секунду

#define encoder_up vol_up_action()      // действие на энкодер
#define encoder_down vol_down_action()      // действие на энкодер
#define key_1_press vol_up_action()      // действие на короткое нажатие кнопки 1 
#define key_1_holding vol_up_action()      // действие на удержание кнопки 1 
#define key_2_press vol_down_action()    // действие на короткое нажатие кнопки 2
#define key_2_holding vol_down_action()    // действие на удержание кнопки 2
#define key_3_press next_action()        // действие на короткое нажатие кнопки 3
#define key_3_holding forward_action()     // действие на удержание кнопки 3
#define key_4_press previous_action()    // действие на короткое нажатие кнопки 4
#define key_4_holding rewind_action()      // действие на удержание кнопки 4
#define key_5_press play_pause_action()  // действие на короткое нажатие кнопки 5
#define key_5_holding mute_action()        // действие на удержание кнопки 5
#define key_6_press alt_tab_action()     // действие на короткое нажатие кнопки 6
#define key_6_holding home_action()        // действие на удержание кнопки 6
#define key_7_press mouse_wheel_up()     // действие на короткое нажатие кнопки 7
#define key_7_holding                      // действие на удержание кнопки 7
#define key_8_press mouse_wheel_down()   // действие на короткое нажатие кнопки 8
#define key_8_holding                      // действие на удержание кнопки 8
#define key_9_press                      // действие на короткое нажатие кнопки 9
#define key_9_holding                        // действие на удержание кнопки 9

#define release_button        1023  // значение при отпущенных кнопках
#define button_release_range  50  // диапазон значения + - при отпущенных кнопках
#define button_range          10  // диапазон значения нажатых кнопок + -
#define time_holding          500 // время для удержания кнопок в миллисекундах
#define time_tinkling         30  // время исключающее дребезг контактов в миллисекундах
#define key_1                 1500  // значение кнопки 1
#define key_2                 1500  // значение кнопки 2
#define key_3                 1500  // значение кнопки 3
#define key_4                 1500  // значение кнопки 4
#define key_5                 1500  // значение кнопки 5
#define key_6                 1500  // значение кнопки 6
#define key_7                 1500  // значение кнопки 7
#define key_8                 1500  // значение кнопки 8
#define key_9                 1500  // значение кнопки 9
//**************************************************************************

uint32_t timerdata_savedata_keytimer_alt_tab;
uint16_t datacounter;
uint8_t pinb_statepinb_state_savepind_state;

void setup() {
  
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)  
  
Keyboard.begin();
  
Mouse.begin();
  
DDRD &= ~(1<<0);
  
PORTD |= (1<<0);
  
DDRD &= ~(1<<4);
  
PORTD |= (1<<4);
}

void loop() {
  
data analogRead(analogPin);
  if((
millis() - timer) > 5) {
    
timer millis();
  
encoder();
    
key();
  }
  if((
millis() - timer_alt_tab) == 1000) {
    
Keyboard.release(KEY_LEFT_ALT);
  }
}

void encoder() {
  if ((
PIND B00010001) != B00010001 && (PIND B00010001)!= B00000000) {
    if ((
PIND B00010001) == B00010000 && pind_state == B00000001) {
      
encoder_up;
    }
    else if ((
PIND B00010001) == B00000001 && pind_state == B00010000) {
      
encoder_down;
    }
    
pind_state = (PIND B00010001); 
  }
  else if ((
PIND B00010001) == B00010001) {
    
pind_state B00000000
  }
}

void key() {
  if(
data >= release_button button_release_range && data <= release_button button_release_range) { // кнопки отпущены
    
if(counter > (time_tinkling 5) && counter < (time_holding 5)) { // короткое нажатие какой-либо кнопки и больше времени исключающее дребезг
      
data_key data_save counter;
      if(
data_key >= (key_1 button_range) && data_key <= (key_1 button_range)) {
        
key_1_press;
      }
      if(
data_key >= (key_2 button_range) && data_key <= (key_2 button_range)) {
        
key_2_press;
      }
      if(
data_key >= (key_3 button_range) && data_key <= (key_3 button_range)) {
        
key_3_press;
      }
      if(
data_key >= (key_4 button_range) && data_key <= (key_4 button_range)) {
        
key_4_press;
      }
      if(
data_key >= (key_5 button_range) && data_key <= (key_5 button_range)) { 
        
key_5_press;
      }
      if(
data_key >= (key_6 button_range) && data_key <= (key_6 button_range)) {
        
key_6_press;
      }
      if(
data_key >= (key_7 button_range) && data_key <= (key_7 button_range)) {
        
key_7_press;
      }
      if(
data_key >= (key_8 button_range) && data_key <= (key_8 button_range)) {
        
key_8_press;
      }
      if(
data_key >= (key_9 button_range) && data_key <= (key_9 button_range)) {
        
key_9_press;
      }
    }
    
data_save 0;
    
counter 0;
  }
  else { 
// нажата какая-то кнопка
    
counter++;
    
data_save data_save data;
    if(
counter >= (time_holding 5)) { // удержание какой-либо кнопки
      
data_key data_save counter;
      if((
counter 20) == 0) { // действие повторяется 10 раз в секунду, пока кнопка нажата
        
if(data_key >= (key_1 button_range) && data_key <= (key_1 button_range)) {
          
key_1_holding;
        }
        if(
data_key >= (key_2 button_range) && data_key <= (key_2 button_range)) {
         
key_2_holding;
        }
        if(
data_key >= (key_3 button_range) && data_key <= (key_3 button_range)) {
          
key_3_holding;
        }
        if(
data_key >= (key_4 button_range) && data_key <= (key_4 button_range)) {
         
key_4_holding;
        }
      }
      if(
counter == (time_holding 5)) { // действие выполняется 1 раз при удержании
        
if(data_key >= (key_5 button_range) && data_key <= (key_5 button_range)) {
         
key_5_holding;
        }
        if(
data_key >= (key_6 button_range) && data_key <= (key_6 button_range)) {
         
key_6_holding;
        }
        if(
data_key >= (key_7 button_range) && data_key <= (key_7 button_range)) {
         
key_7_holding;
        }
        if(
data_key >= (key_8 button_range) && data_key <= (key_8 button_range)) {
         
key_8_holding;
        }
        if(
data_key >= (key_9 button_range) && data_key <= (key_9 button_range)) {
         
key_9_holding;
        }
      }
    }
  }
}

void vol_up_action() {
  
Remote.increase();
  
Remote.clear();
}
void vol_down_action() {
  
Remote.decrease();
  
Remote.clear();
}
void next_action() {
  
Remote.next();
  
Remote.clear();
}
void forward_action() {
  
Remote.forward();
  
Remote.clear();
}
void previous_action() {
  
Remote.previous();
  
Remote.clear();
}
void rewind_action() {
  
Remote.rewind();
  
Remote.clear();
}
void play_pause_action() {
  
Remote.play_pause();
  
Remote.clear();
}
void mute_action() {
  
Remote.mute();
  
Remote.clear();
}
void alt_tab_action() {
  if((
millis() - timer_alt_tab) > 1000) {
    
Keyboard.press(KEY_LEFT_ALT);
    
Keyboard.press(KEY_TAB);
    
Keyboard.release(KEY_TAB);
    
Keyboard.press(KEY_TAB);
    
Keyboard.release(KEY_TAB);
    
timer_alt_tab millis();
  }
  else {
    
Keyboard.press(KEY_TAB);
    
Keyboard.release(KEY_TAB);
    
timer_alt_tab millis();
  }
}
void home_action() {
  
Remote.home();
  
Remote.clear();
}
void play_action() {
  
Remote.play();
  
Remote.clear();
}
void pause_action() {
  
Remote.pause();
  
Remote.clear();
}
void stop_action() {
  
Remote.stop();
  
Remote.clear();
}
void power_action() {
  
Remote.power();
  
Remote.clear();
}

void mouse_wheel_up() {
  
Mouse.move(001);
}

void mouse_wheel_down() {
  
Mouse.move(00, -1);



jonikus81 14.08.2017 07:24

мой косяк, в привате отдал рабочий скетч, а сюда не выложил :blush:

palexsa 27.10.2020 01:23

Скетч приведенный уважаемым lti1 работает только если резистивные кнопки притянуты к плюсу. У меня была схема с подтяжкой к земле. #define release_button приравнивал к нулю - энкодер работает, а кнопки нет. Скетч в посте #307 работает с обоими вариантами схемы.


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

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