Официальный сайт компании Arduino по адресу arduino.cc
создание экзеаляра класса в функции
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Добрый вчер, потхоньку реализую поект. В нём планируется достаточно ного кнопок, которые будут подключены одновреено. Чтобы не расписывать в сетапе и лупе каждую кнопку отдельно, хочу создать функции для сетапа и для лупа. Но наткнулся на библиотеку 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() { }
всё уже украдено до тебя класс титановый велосипед для тактовой кнопки.
*тему читать с конца, флуд с воплями усчемлённых и обиженных пропускать.
Вы хотите, что бы у вас получилось это
как создаватьэкзепляр класса в экзепляре функции
Не понял вопроса. За редким исключением в этом языке в всё делается "в функции". Что Вы имеете в виду. А как Вы его "не в функции" создаёте?
qwone Я так понимаю все подключенные модули собственного производства. Раз так я не совсем понимаю методы.
Титановый велосипед попробую, только насчёт задержек повторного срабатывания кнопок не увидел. Наверно придётся доделывать. Под этим имею ввиду такой пример. Вы набрали текст в блокноте, допустим. Жмёте бэкспейс и держите. Комп вам не удаляет всё со скоростью работы процессора, а каждый символ с некоторой задержкой. Правда задержка тоже уменьшается, если замечали, но это не важно. Вот такой эффект нужен, а то зажму кеопку и в миг параметр наберёт нехилое значение.
как создаватьэкзепляр класса в экзепляре функции
Не понял вопроса. За редким исключением в этом языке в всё делается "в функции". Что Вы имеете в виду. А как Вы его "не в функции" создаёте?
[/quote]
Не спорю, объект можно создать в функции типа main(), если набить его ручками, это понятно. Но если я делаю функцию, которая создаёт объект и пишу в том же мэйне void func(), потом void func() и т.д. Как объектам присваивать уникальное имя. Ведь создаёте объект как :
classname ob1,ob2...; Имена уникальны.
Вообщем, надеюсь, смекнули о чём я?
Вообщем, надеюсь, смекнули о чём я?
Нет.
если я делаю функцию, которая создаёт объект и пишу в том же мэйне void func(), потом void func() и т.д. Как объектам присваивать уникальное имя. Ведь создаёте объект как :
classname ob1,ob2...; Имена уникальны.
Как Вы собираетесь писать "void func(), потом void func()" "в том же мэйне"? Вложенные функции? Так их в этом языке нет. Есть их аналог, но это сильно (очень сильно) не для начинающих. Так что я не понял, что Вы хотели мне объяснить.
Для использования 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.
У вас в голове каша. Я же скечь вам выложил. Скачайте и посмотрите, как классы организовал. Примитивно ведь организовал. Объявляете объекты, в сетапе даете индивидульные настройки , а в лупе работаете.
Объект надо создавать до setup(). Все что внутри {} саздается и там и остается.
Спасибо, я к этоу ещё вернусь! Но мне титан велик пока понятней. Попробую помудрить с таймерами.
Титановый велосипед попробую, только насчёт задержек повторного срабатывания кнопок не увидел. Наверно придётся доделывать. Под этим имею ввиду такой пример. Вы набрали текст в блокноте, допустим. Жмёте бэкспейс и держите. Комп вам не удаляет всё со скоростью работы процессора, а каждый символ с некоторой задержкой. Правда задержка тоже уменьшается, если замечали, но это не важно. Вот такой эффект нужен, а то зажму кеопку и в миг параметр наберёт нехилое значение.
и не увидишь - нет повода бороться и настраивать то, чего нет.
нажатие/отпускание кнопки порождает событие, актуальное в течении того цикла программы на который приходится нажатие/отпускание кнопки.
т.е. одно нажатие/одно отпускание - одно событие.
автоповтор отсутствует.
Ну вот есть пример с таймером. Если изменить можно подогнать под то что я хочу. Правда вчера достаточно бегло посмотрел код велика, если функции не повторяют события при удержании кнопки- то вообще мне проще самому писать алгоритм срабатывания каждой кнопки.
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no.... Смотреть там, где речь заходит про таймер.
Правда вчера достаточно бегло посмотрел код велика, если функции не повторяют события при удержании кнопки- то вообще мне проще самому писать алгоритм срабатывания каждой кнопки.
можешь, просто, бегло идти нахуй и не ебать мне и форумчанам мосг.
Клёвый код, я так понимаю здесь предложено создавать экземпляры класса динамически. Блин, не такой я топовый программер, чтобы конкретно понимать что здесь к чему, а хотелось бы. Если можно объясните подробнее конструкцию, пожалуйста.
Правда вчера достаточно бегло посмотрел код велика, если функции не повторяют события при удержании кнопки- то вообще мне проще самому писать алгоритм срабатывания каждой кнопки.
можешь, просто, бегло идти нахуй и не ебать мне и форумчанам мосг.
Это дело не хитрое, создай себе экземпляр и иди.
Я бы абяснил, канешна. Да только у мня нет библиотеки Bounce.
Только вопщих чертах могу, безотносительно конкретных кнопок.
Я бы абяснил, канешна. Да только у мня нет библиотеки Bounce.
Только вопщих чертах могу, безотносительно конкретных кнопок.
Был бы благодарен. Просто конструкцию понять хочу, ибо с таким не сталкивался
Наверное, для Ардуины не нужно создавать класс кнопки динамически, число их жёстко задано в проекте и "на лету" не меняется. Лучше всё-же, наерн, статические классы использовать, меньше заморочек с памятью будет.
Наверное, для Ардуины не нужно создавать класс кнопки динамически, число их жёстко задано в проекте и "на лету" не меняется. Лучше всё-же, наерн, статические классы использовать, меньше заморочек с памятью будет.
В целом согласен, но как тогда создавать объект функцией?
Вот пока что имеется, железо пока недособрано, проверить не на чем. Компилируется пока всё, но такое чувство, что что-то не то.
#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[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 указывая сколько байт массива мы хотим отправить
}
{
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; }}}};
}
На сколько, понятно речь идёт о двух функциях внизу и массивами, которые с ними связаны.
48
pinMode (pin,OUTPUT);
pin чему равно?
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);
Ошибка не в этом, pinMode (pin,OUTPUT); INPUT естестно
Ошибка не в этом, pinMode (pin,OUTPUT); INPUT естестно
чему равен pin?
Жесть. Из анекдота:
Может человек на Бейсике программы на Ардуино пишет.
Наверное, для Ардуины не нужно создавать класс кнопки динамически, число их жёстко задано в проекте и "на лету" не меняется. Лучше всё-же, наерн, статические классы использовать, меньше заморочек с памятью будет.
Как редко здесь звучат верные мысли от "свежеприбывших"! Респект!
И статический не для каждой кнопки, ибо много чести, а для всех сразу.
pin параметр функции setup_button(), внутри этой функции pinMode. Вообщем пин является общим параметром сразу для трёх функций. В setup() этим самым настроены пины от 22 до 29. Я эту функцию написал специально чтобы текст на одни и теже повторения не тратить. Понятно, что это не СМС, но скролить туда-сюда меньше
Не запуттаться бы в скобках, когда буду писать для удержания 2х кнопок.
Наверное, для Ардуины не нужно создавать класс кнопки динамически, число их жёстко задано в проекте и "на лету" не меняется. Лучше всё-же, наерн, статические классы использовать, меньше заморочек с памятью будет.
Как редко здесь звучат верные мысли от "свежеприбывших"! Респект!
И статический не для каждой кнопки, ибо много чести, а для всех сразу.
ну, я не знаю - внезапно, физические кнопки динамически подключаются вкуда-подало пинам... что тогда? - сейчас это пин кнопки - нажал, и это уже пин светодиода. что тогда - как быть и вкуда бечь?
*о! дык, у меня же этой проблемы нет - я могу в лупе переинициализировать пины кнопок налету.
присвоить новые значения элементам массива button_pin[] и сделать button_pin_auto();
[мерзко хихикая ушёл спать]
физические кнопки динамически подключаются вкуда-подало пинам... что тогда? - сейчас это пин кнопки - нажал, и это уже пин светодиода. что тогда - как быть и вкуда бечь?
.. а вышел на улицу, а там динозав, от что тогда, что делать?
ПС. Спокойной ночи.
Вот она, рабочая задумка. Может кому пригодится.