создание экзеаляра класса в функции

Killbit
Offline
Зарегистрирован: 05.01.2017

Добрый вчер, потхоньку реализую поект. В нём планируется достаточно ного кнопок, которые будут подключены одновреено. Чтобы не расписывать в сетапе и лупе каждую кнопку отдельно, хочу создать функции для сетапа и для лупа. Но наткнулся на библиотеку bonce2 , которая борится с дребезго контактов. А для неё надо создавать экзепляр класса. Соответственно в каждом экзепляре функции нужно чтобы создавался новый экзепляр класса. Да и вообще вроде как в сетапе экзепляры не создаются.

В целом для каждой кнопки нужно установить внутренний подтягивающий резистор, устронить дребезг, установить задержку на повторное срабатывание кнопки, естественно без delay так как она будет стопорить программу. В принципе нашёл как таймер сделать, но для него него тоже нужно хранилище для записи миллисекунд.

В цело вопрос в том как создаватьэкзепляр класса в экзепляре функции и как создавать хранилище для таймера. И вообще реализуе ли мой подход или не нужно подходить к этому с другой стороны?


#include <Bounce2.h>
#include <SPI.h>                                          // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку для работы с nRF24L01+
using namespace std;
RF24           radio(48, 53);                              // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[10];                                   // Создаём массив для приёма данных
void setup_button();
void loop_button();
Bounce bouncer1 = Bounce();
void setup(){
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(5);                                  // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0x1234567890LL);               // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
}
void loop(){
 
    data[0] = analogRead(A1);                             // считываем показания Trema слайдера с вывода A1 и записываем их в 0 элемент массива data
    data[1] = analogRead(A2);                             // считываем показания Trema потенциометра с вывода A2 и записываем их в 1 элемент массива data
    radio.write(&data, sizeof(data));                     // отправляем данные из массива data указывая сколько байт массива мы хотим отправить
}
void setup_button(int pin, int i)
{
  Bounce bouncer_[i] = Bounce();  // Вероятно бред, но компилируется
}
void loop_button()
{
}

 

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

всё уже украдено до тебя класс титановый велосипед для тактовой кнопки.

*тему читать с конца, флуд с воплями усчемлённых и обиженных пропускать.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вы хотите, что бы у вас получилось это

/* to_aavs.ino  https://yadi.sk/d/yiO-01BG3B6n2N
  #1 реле 1->8 (relay1_pin) Включает реле c задержкой 1 сек. до окончания отключения кнопки и повторного срабатывания 6 пина.
  #2 реле 2->7 (relay2_pin) Включает реле сразу но на 5 сек. после отключается и бездействует до повторного срабатывания 6 пина.
  #3 светодиод -мигалка
  #4 блок управления мигалкой
  #5 кнопка с фиксацией->6 (btm1_pin) 1 нажата /0 нет
*/
//  #1 реле 1
#include "Cl_time_relay.h"
const byte relay1_pin = 7;
Cl_time_relay Relay1;
//  #2 реле 2
const byte relay2_pin = 8;
Cl_time_relay Relay2;
//  #3 светодиод -мигалка
#include "Cl_led.h"
const byte led1_pin = 13;
Cl_led Led1; // создать
//  #4 блок управления мигалкой
#include "Cl_team_delay.h"
Cl_team_delay Team;
void func_3() {
    Led1.blink();
}
void func_4() {
    Led1.OFF();
}
//  #5 кнопка с фиксацией
#include "Cl_do_btn_dn_up.h"
const byte btn1_pin = 2;
Cl_do_btn_dn_up Do_btm1; // создать
void func_1() {
  Relay1.ON();
  Relay2.ON();
  Team.ON();
}
void func_2() {
  Relay1.OFF();
  Relay2.OFF();
  Team.OFF();
}
void setup() {
  //  #1 реле 1
  Relay1.logic = 0; // реле вкл 0
  Relay1.time_ON = 0;// нет задержки вкл
  Relay1.time_OFF = 0;// нет задержки выкл
  Relay1.setup(relay1_pin);
  //  #2 реле 2
  Relay2.logic = 0; // реле вкл 0
  Relay2.time_ON = 300;//задержка вкл 300 миллисек
  Relay2.time_OFF = 00;//задержка выкл 300 миллисек
  Relay2.setup(relay2_pin);
  //  #3 светодиод -мигалка
  Led1.T_blink = 500;
  Led1.logic = 1;
  Led1.setup(led1_pin);
  //  #4 блок управления мигалкой
  Team.time_ON = 1000;//задержка вкл 1000 миллисек=1 сек
  Team.time_OFF = 00;//задержка выкл 300 миллисек
  Team.setup(& func_3 , & func_4);
  //  #5 кнопка с фиксацией
  Do_btm1.logic = 0; // когда 0 это нажатая кнопка
  Do_btm1.setup(btn1_pin);
}
void loop() {
  //  #1 реле 1
  Relay1.loop();
  //  #2 реле 2
  Relay2.loop();
  //  #3 светодиод -мигалка
   Led1.loop();
  //  #4 блок управления мигалкой
  Team.loop(& func_3 , & func_4);
  //  #5 кнопка с фиксацией
  Do_btm1.loop(& func_1 , & func_2 );
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Killbit пишет:

как создаватьэкзепляр класса в экзепляре функции 

Не понял вопроса. За редким исключением в этом языке в всё делается "в функции". Что Вы имеете в виду. А как Вы его "не в функции" создаёте?

Killbit
Offline
Зарегистрирован: 05.01.2017

qwone Я так понимаю все подключенные модули собственного производства. Раз так я не совсем понимаю методы.

Титановый велосипед попробую, только насчёт задержек повторного срабатывания кнопок не увидел. Наверно придётся доделывать. Под этим имею ввиду такой пример. Вы набрали текст в блокноте, допустим. Жмёте бэкспейс и держите. Комп вам не удаляет всё со скоростью работы процессора, а каждый символ с некоторой задержкой. Правда задержка тоже уменьшается, если замечали, но это не важно. Вот такой эффект нужен, а то зажму кеопку и в миг параметр наберёт нехилое значение.

Killbit
Offline
Зарегистрирован: 05.01.2017

ЕвгенийП]</p> <p>[quote=Killbit пишет:

как создаватьэкзепляр класса в экзепляре функции 

Не понял вопроса. За редким исключением в этом языке в всё делается "в функции". Что Вы имеете в виду. А как Вы его "не в функции" создаёте?

[/quote]

Не спорю, объект можно создать в функции типа main(), если набить его ручками, это понятно. Но если я делаю функцию, которая создаёт объект и пишу в том же мэйне void func(), потом void func() и т.д. Как объектам присваивать уникальное имя. Ведь создаёте объект как :

classname ob1,ob2...; Имена уникальны. 

Вообщем, надеюсь, смекнули о чём я?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Killbit пишет:

Вообщем, надеюсь, смекнули о чём я?

Нет.

Killbit пишет:

если я делаю функцию, которая создаёт объект и пишу в том же мэйне void func(), потом void func() и т.д. Как объектам присваивать уникальное имя. Ведь создаёте объект как :

classname ob1,ob2...; Имена уникальны. 

Как Вы собираетесь писать "void func(), потом void func()"  "в том же мэйне"? Вложенные функции? Так их в этом языке нет. Есть их аналог, но это сильно (очень сильно) не для начинающих. Так что я не понял, что Вы хотели мне объяснить.

 

Killbit
Offline
Зарегистрирован: 05.01.2017

Для использования Bounce2 нужно создать экзепляр класса. Этот экземпляр будет со своими данныи и пригоден для работы с одной кнопкой(если не прав- поправте). Чисто для экономии места хочу создать функцию для настройки отдельной кнопки и функцию, которая будет помещена в loop.

void setup_button(int pin, int i)
25 {
26   Bounce bouncer_[i] = Bounce();  // Вероятно бред, но компилируется. Здесь я пытаюсь создать объект. И так как функция //будет вызываться несколько раз каждый раз должен создаваться новый объект.
27 }
28 void loop_button()
29

{

 

30 }

С лупом ещё куда всё не шло, но с сетапом проблема. Необходимо создать объект, объект должен быть с уникальным именем, так как для каждой кнопки в моём понимании нужны свои данные (опять же могу ошибаться). Выше не правильно написал по поводу синтаксиса в maine

в моём случае

void setup{

setup_button(40,1); //к примеру

setup_button(41,2); //к примеру}

Я понимаю, что этот фрагмент кода бредовый, видимо, но я пытаюсь понять можно ли функцией создать объект с уникальным именем. Поясняю: я пытаюсь разобраться. Весь смысл конкретно этого разрабатываемого скетча в том, чтобы снимать показания с джойстика, конкретно defender cobra r4. Обрабатывать получаемые данные и отправлять их по радиоканалу. Можете посмотреть что это за джой. Там 4 потенциометра и 13 вроде кнопок. С потенциоетрами понятно всё, а вот с кнопками ньюансы. Но так понимаю, что придётся каждую кнопку расписывать отдельно по крайней мере в setup. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

У вас в голове каша. Я же скечь вам выложил. Скачайте и посмотрите, как классы организовал. Примитивно ведь организовал. Объявляете объекты, в сетапе даете индивидульные настройки , а в лупе работаете. 

Объект надо создавать до setup(). Все что внутри {} саздается и там и остается.

/* Class_do_btn.ino
  #1 кнопка ->2
  #2 кнопка ->3
  #3 кнопка ->4
  Принцип кода:нажал на кнопку , отправилось сообщение в сериал
*/
//#1 кнопка 1
#include "Cl_do_btn.h"
const byte btn1_pin = 2;
Cl_do_btn Do_btm1; // создать
void func_1() {
  Serial.println("Press Bottom 1");
}
//#2 кнопка 2
const byte btn2_pin = 3;
Cl_do_btn Do_btm2; // создать
void func_2() {
  Serial.println("Press Bottom 2");
}
//#3 кнопка 3
const byte btn3_pin = 4;
Cl_do_btn Do_btm3; // создать
void func_3() {
  Serial.println("Press Bottom 3");
}
void setup() {
  Serial.begin(9600);
  //#1 кнопка 1
  Do_btm1.setup(btn1_pin);
  //#2 кнопка 2
  Do_btm2.setup(btn2_pin);
  //#3 кнопка 3
  Do_btm3.setup(btn3_pin);
}
void loop() {
  //#1 кнопка 1
  Do_btm1.loop(& func_1  );
  //#2 кнопка 2
  Do_btm2.loop(& func_2  );
  //#3 кнопка 3
  Do_btm3.loop(& func_3  );
}
/*Cl_do_btn.cpp
*/
#include "Arduino.h"
#include "Cl_do_btn.h"
Cl_do_btn::Cl_do_btn() {
}
void Cl_do_btn::setup(byte _pin) {
  btn_pin = _pin;
  pinMode(btn_pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой
  btn = digitalRead(btn_pin) ; // прочитать реальное значение на выводе
}
void Cl_do_btn::loop(void (* _func_1)()) {
  if (! bounce_btn && btn != digitalRead(btn_pin)) { // если прошел фронт изм на выводн
    bounce_btn = 1;                                 // выставить флаг
    past = millis();                         // сделать временую засветку
  }
  else if ( bounce_btn && millis() - past >= 5 ) { // если прошло антидребезговое время
    bounce_btn = 0;      // то снять флаг
    btn_old = btn ;
    btn = digitalRead(btn_pin) ; // прочитать реальное значение на выводе
    if (btn_old && ! btn) _func_1()  ;
  }
}
/*Cl_do_btn.h
*/
#ifndef Cl_do_btn_h
#define Cl_do_btn_h

#include "Arduino.h"
class Cl_do_btn {
  public:
    Cl_do_btn();
    void setup(byte _pin);
    void loop(void (* _func_1)());
  private:
    byte btn_pin ;
    bool btn, btn_old;
    bool bounce_btn = 0; // антидребезговый флаг
    uint32_t past = 0 ;
};
#endif //Cl_do_btn_h

 

Killbit
Offline
Зарегистрирован: 05.01.2017

Спасибо, я к этоу ещё вернусь! Но мне титан велик пока понятней. Попробую помудрить с таймерами.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

Killbit пишет:

Титановый велосипед попробую, только насчёт задержек повторного срабатывания кнопок не увидел. Наверно придётся доделывать. Под этим имею ввиду такой пример. Вы набрали текст в блокноте, допустим. Жмёте бэкспейс и держите. Комп вам не удаляет всё со скоростью работы процессора, а каждый символ с некоторой задержкой. Правда задержка тоже уменьшается, если замечали, но это не важно. Вот такой эффект нужен, а то зажму кеопку и в миг параметр наберёт нехилое значение.

и не увидишь - нет повода бороться и настраивать то, чего нет.

нажатие/отпускание кнопки порождает событие, актуальное в течении того цикла программы на который приходится нажатие/отпускание кнопки.

т.е. одно нажатие/одно отпускание - одно событие.

автоповтор отсутствует.

 

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017
Bounce *setup_button(int pin)
25	{
26	  Bounce *tmp  = new Bounce(pin);  
          .
          .  // настройка кнопки tmp-> ляляля
          .
          return tmp;   // и потом сохрани в каком-нить массиве штоли. 
27	}

присваиваешь потом Bounce *button = setup_button(2);
обращение потом только сложнее. Вместо "button." придется писать "button->"

 

Killbit
Offline
Зарегистрирован: 05.01.2017

Ну вот есть пример с таймером. Если изменить можно подогнать под то что я хочу. Правда вчера достаточно бегло посмотрел код велика, если функции не повторяют события при удержании кнопки- то вообще мне проще самому писать алгоритм срабатывания каждой кнопки.

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no.... Смотреть там, где речь заходит про таймер.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

Killbit пишет:

Правда вчера достаточно бегло посмотрел код велика, если функции не повторяют события при удержании кнопки- то вообще мне проще самому писать алгоритм срабатывания каждой кнопки.

можешь, просто, бегло идти нахуй и не ебать мне и форумчанам мосг.

Killbit
Offline
Зарегистрирован: 05.01.2017

DetSimen пишет:

Bounce *setup_button(int pin)
25	{
26	  Bounce *tmp  = new Bounce(pin);  
          .
          .  // настройка кнопки tmp-> ляляля
          .
          return tmp;   // и потом сохрани в каком-нить массиве штоли. 
27	}

присваиваешь потом Bounce *button = setup_button(2);
обращение потом только сложнее. Вместо "button." придется писать "button->"

 

Клёвый код, я так понимаю здесь предложено создавать экземпляры класса динамически. Блин, не такой я топовый программер, чтобы конкретно понимать что здесь к чему, а хотелось бы. Если можно объясните подробнее конструкцию, пожалуйста.

Killbit
Offline
Зарегистрирован: 05.01.2017

Клапауций 823 пишет:

Killbit пишет:

Правда вчера достаточно бегло посмотрел код велика, если функции не повторяют события при удержании кнопки- то вообще мне проще самому писать алгоритм срабатывания каждой кнопки.

можешь, просто, бегло идти нахуй и не ебать мне и форумчанам мосг.

Это дело не хитрое, создай себе экземпляр и иди.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Я бы абяснил, канешна. Да только у мня нет библиотеки Bounce. 

Только вопщих чертах могу, безотносительно конкретных кнопок. 

Killbit
Offline
Зарегистрирован: 05.01.2017

DetSimen пишет:

Я бы абяснил, канешна. Да только у мня нет библиотеки Bounce. 

Только вопщих чертах могу, безотносительно конкретных кнопок. 

Был бы благодарен. Просто конструкцию понять хочу, ибо с таким не сталкивался

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Наверное, для Ардуины не нужно создавать класс кнопки динамически, число их жёстко задано в проекте и "на лету" не меняется. Лучше всё-же, наерн, статические классы использовать, меньше заморочек с памятью будет. 

Killbit
Offline
Зарегистрирован: 05.01.2017

DetSimen пишет:

Наверное, для Ардуины не нужно создавать класс кнопки динамически, число их жёстко задано в проекте и "на лету" не меняется. Лучше всё-же, наерн, статические классы использовать, меньше заморочек с памятью будет. 

В целом согласен, но как тогда создавать объект функцией?

Killbit
Offline
Зарегистрирован: 05.01.2017

Вот пока что имеется, железо пока недособрано, проверить не на чем. Компилируется пока всё, но такое чувство, что что-то не то.



#include <Bounce2.h>
#include <SPI.h>                                          // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку для работы с nRF24L01+
using namespace std;
void setup_button(int pin);
RF24           radio(48, 53);                              // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[12];                                   // Создаём массив для приёма данных
Bounce b[8]={Bounce(22,5),Bounce(23,5),Bounce(24,5),Bounce(25,5),Bounce(26,5),Bounce(27,5),Bounce(28,5),Bounce(29,5)};
int Button_data[8]={0,0,0,0,0,0,0,0};
unsigned long t[8]={0,0,0,0,0,0,0,0};
/*
Bounce bouncer1 = Bounce(22,5);
Bounce bouncer2 = Bounce(23,5);
Bounce bouncer3 = Bounce(24,5);
Bounce bouncer4 = Bounce(25,5);
Bounce bouncer5 = Bounce(26,5);
Bounce bouncer6 = Bounce(27,5);
Bounce bouncer7 = Bounce(28,5);
Bounce bouncer8 = Bounce(29,5);*/
void setup(){
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(5);                                  // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0x1234567890LL);               // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
 
    setup_button(22);
    setup_button(23);
    setup_button(24);
    setup_button(25);
    setup_button(26);
    setup_button(27);
    setup_button(28);
    setup_button(29);
}
void loop(){
    data[0] = analogRead(A1);                             // считываем показания Trema слайдера с вывода A1 и записываем их в 0 элемент массива data
    data[1] = analogRead(A2);
    data[2] = analogRead(A3);                             // считываем показания Trema слайдера с вывода A1 и записываем их в 0 элемент массива data
    data[3] = analogRead(A4);                             // считываем показания Trema потенциометра с вывода A2 и записываем их в 1 элемент массива data
    radio.write(&data, sizeof(data));                     // отправляем данные из массива data указывая сколько байт массива мы хотим отправить
}
void setup_button(int pin)
{
  pinMode (pin,OUTPUT);
    digitalWrite(pin,HIGH);
}
void button_plus(int i, int d)
{
 if (b[i].update()){if ( b[i].read() == HIGH){if (millis()-t[i]>500){t[i]=millis();if(Button_data[d]<255) {Button_data[d]=Button_data[d]++;}}}};
}
void button_minus(int i, int d)
{
 
 if (b[i].update()){if ( b[i].read() == HIGH){if (millis()-t[i]>500){t[i]=millis();if(Button_data[d]>0) {Button_data[d]=Button_data[d]-1; }}}};
}

 

 

На сколько, понятно речь идёт о двух функциях внизу и массивами, которые с ними связаны.

 

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017
48   pinMode (pin,OUTPUT);

pin чему равно?

Killbit
Offline
Зарегистрирован: 05.01.2017

Клапауций 823 пишет:

48   pinMode (pin,OUTPUT);

pin чему равно?

 

void setup_button(int pin){.....}

setup_button(22);
    setup_button(23);
    setup_button(24);
    setup_button(25);
    setup_button(26);
    setup_button(27);
    setup_button(28);
    setup_button(29);

 

Killbit
Offline
Зарегистрирован: 05.01.2017

Ошибка не в этом, pinMode (pin,OUTPUT); INPUT естестно

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

Killbit пишет:

Ошибка не в этом, pinMode (pin,OUTPUT); INPUT естестно

чему равен pin?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Жесть. Из анекдота:

- А радио на чем: на лампах или на транзисторах.
-Специально для тупых : на бронепоезде.

Может человек на Бейсике программы на Ардуино пишет.

Logik
Offline
Зарегистрирован: 05.08.2014

DetSimen пишет:

Наверное, для Ардуины не нужно создавать класс кнопки динамически, число их жёстко задано в проекте и "на лету" не меняется. Лучше всё-же, наерн, статические классы использовать, меньше заморочек с памятью будет. 

Как редко здесь звучат верные мысли от "свежеприбывших"! Респект!

И статический не для каждой кнопки, ибо много чести, а для всех сразу.

Killbit
Offline
Зарегистрирован: 05.01.2017

pin параметр функции setup_button(), внутри этой функции pinMode. Вообщем пин является общим параметром сразу для трёх функций. В setup() этим самым настроены пины от 22 до 29. Я эту функцию написал специально чтобы текст на одни и теже повторения не тратить. Понятно, что это не СМС, но скролить туда-сюда меньше

Killbit
Offline
Зарегистрирован: 05.01.2017

Не запуттаться бы в скобках, когда буду писать для удержания 2х кнопок.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

Logik пишет:

DetSimen пишет:

Наверное, для Ардуины не нужно создавать класс кнопки динамически, число их жёстко задано в проекте и "на лету" не меняется. Лучше всё-же, наерн, статические классы использовать, меньше заморочек с памятью будет. 

Как редко здесь звучат верные мысли от "свежеприбывших"! Респект!

И статический не для каждой кнопки, ибо много чести, а для всех сразу.

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

*о! дык, у меня же этой проблемы нет - я могу в лупе переинициализировать пины кнопок налету.

присвоить новые значения элементам массива button_pin[] и сделать button_pin_auto();

[мерзко хихикая ушёл спать]

Logik
Offline
Зарегистрирован: 05.08.2014

Клапауций 823 пишет:

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

.. а вышел на улицу, а там динозав, от что тогда, что делать?

Клапауций 823 пишет:
 как быть и вкуда бечь?
.. именно куда бечь?  И как с этим жить? Как на улицу выходить? Или кто тихо ночю, ага... [мерзко хихикая ..] .. перепаивает кнопки и светодиоды, меняет их местами пока [.. ушёл спать]?

ПС. Спокойной ночи.

 

Killbit
Offline
Зарегистрирован: 05.01.2017

Вот она, рабочая задумка. Может кому пригодится.

 

 

#include <Bounce2.h>
#include <SPI.h>                                          // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку для работы с nRF24L01+
using namespace std;
RF24           radio(48, 53);                              // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[21];                                   // Создаём массив для приёма данных
Bounce db[17]{
Bounce(22,5),// 0
Bounce(23,5),//1
Bounce(24,5),//2
Bounce(25,5),//3
Bounce(26,5),//4
Bounce(27,5),//5
Bounce(28,5),//6
Bounce(29,5),//7
Bounce(30,5),//8
Bounce(31,5),//9
Bounce(32,5),//10
Bounce(33,5),//11
Bounce(34,5),//12
Bounce(35,5),//13
Bounce(37,5),//14
Bounce(39,5),//15
Bounce(41,5)//16
};
unsigned long t[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int Button_data[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void setup(){
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(5);                                  // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0x1234567890LL);               // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
 
    pinMode(22,INPUT_PULLUP);
    pinMode(23,INPUT_PULLUP);
    pinMode(24,INPUT_PULLUP);
    pinMode(25,INPUT_PULLUP);
    pinMode(26,INPUT_PULLUP);
    pinMode(27,INPUT_PULLUP);
    pinMode(28,INPUT_PULLUP);
    pinMode(29,INPUT_PULLUP);
    pinMode(30,INPUT_PULLUP);
    pinMode(31,INPUT_PULLUP);
    pinMode(32,INPUT_PULLUP);
    pinMode(33,INPUT_PULLUP);
    pinMode(34,INPUT_PULLUP);
    pinMode(35,INPUT_PULLUP);
    pinMode(37,INPUT_PULLUP);
    pinMode(39,INPUT_PULLUP);
    pinMode(41,INPUT_PULLUP);
    Serial.begin(9600);
}
void loop(){
button_plus(3,1,100,25,2);   //ЦП Верх
button_minus(7,1,100,29,2);  //ЦП низ
button_plus(15,2,100,39,3);  //ЦП право 
button_minus(9,2,100,31,3);  //ЦП лево

Data_filter(2,0,A2);         //Тангаж
Data_filter(3,1,A0);         //Крен
data[2]=analogRead(A1)/4;    //Рысканье

two_Val_button_plus(1,0,100,23,0,1);      //VS верх
two_Val_button_minus(5,0,100,27,0,1);     //VS низ
double_button_plus(12,1,0,100,34,23,0);   //VS верх лево
double_button_plus(1,16,0,100,23,41,1);   //VS верх право
double_button_minus(12,5,0,100,34,27,0);  //VS низ лево
double_button_minus(16,5,0,100,41,27,1);  //VS низ право
data[3]=Button_data[0];                   //Светодиоды тёплые
data[4]=Button_data[1];                   //Светодиоды белые

   radio.write(&data, sizeof(data));                     // отправляем данные из массива data указывая сколько байт массива мы хотим отправить
}

void button_plus(int obMass,int tMass,int dellay, int pin, int  batData)
{
  if ( db[obMass].read() !=digitalRead(pin) ){
    if (millis()-t[tMass]>dellay){t[tMass]=millis();
    {if(Button_data[batData]<255) 
    {Button_data[batData]=Button_data[batData]+1;}}}}
}
void button_minus(int obMass,int tMass,int dellay, int pin, int  batData)
{
  if ( db[obMass].read() !=digitalRead(pin) ){
    if (millis()-t[tMass]>dellay){t[tMass]=millis();
    {if(Button_data[batData]>0) 
    {Button_data[batData]=Button_data[batData]-1;}}}}
}
void double_button_plus(int obMass1,int obMass2,int tMass,int dellay, int pin1,int pin2, int  batData)
{
  if (( db[obMass1].read() !=digitalRead(pin1))&&(db[obMass2].read() !=digitalRead(pin2))){
    if (millis()-t[tMass]>dellay){t[tMass]=millis();
    {if(Button_data[batData]<255) 
    {Button_data[batData]=Button_data[batData]+1;}}}}
}
void double_button_minus(int obMass1,int obMass2,int tMass,int dellay, int pin1,int pin2, int  batData)
{
  if (( db[obMass1].read() !=digitalRead(pin1))&&(db[obMass2].read() !=digitalRead(pin2))){
    if (millis()-t[tMass]>dellay){t[tMass]=millis();
    {if(Button_data[batData]>0) 
    {Button_data[batData]=Button_data[batData]-1;}}}}
}
void two_Val_button_plus(int obMass,int tMass,int dellay, int pin, int  batData1, int batData2)
{
  if ( db[obMass].read() !=digitalRead(pin) ){
    if (millis()-t[tMass]>dellay){t[tMass]=millis();
    {if((Button_data[batData1]<255)&&(Button_data[batData2]<255)) 
    {Button_data[batData1]=Button_data[batData1]+1;Button_data[batData2]=Button_data[batData2]+1;}}}}
}
void two_Val_button_minus(int obMass,int tMass,int dellay, int pin, int  batData1, int batData2)
{
  if ( db[obMass].read() !=digitalRead(pin) ){
    if (millis()-t[tMass]>dellay){t[tMass]=millis();
    {if((Button_data[batData1]>0)&&(Button_data[batData2]>0)) 
    {Button_data[batData1]=Button_data[batData1]-1;Button_data[batData2]=Button_data[batData2]-1;}}}}
}
void Data_filter(int batData, int dataMass, int pin)
{
  if((Button_data[batData]+analogRead(pin)/4)<0)data[dataMass]=0;
  if((Button_data[batData]+analogRead(pin)/4)>255)data[dataMass]=0;
  if((((Button_data[batData]+analogRead(pin))/4)>=0)&&((Button_data[batData]+analogRead(pin)/4)<=255)){data[dataMass]=Button_data[batData]+analogRead(pin)/4;}
}