создание экзеаляра класса в функции
- Войдите на сайт для отправки комментариев
Добрый вчер, потхоньку реализую поект. В нём планируется достаточно ного кнопок, которые будут подключены одновреено. Чтобы не расписывать в сетапе и лупе каждую кнопку отдельно, хочу создать функции для сетапа и для лупа. Но наткнулся на библиотеку 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.
voidsetup_button(intpin,inti)25{26Bounce bouncer_[i] = Bounce();// Вероятно бред, но компилируется. Здесь я пытаюсь создать объект. И так как функция //будет вызываться несколько раз каждый раз должен создаваться новый объект.27}28voidloop_button()29{30}С лупом ещё куда всё не шло, но с сетапом проблема. Необходимо создать объект, объект должен быть с уникальным именем, так как для каждой кнопки в моём понимании нужны свои данные (опять же могу ошибаться). Выше не правильно написал по поводу синтаксиса в maine
в моём случае
void setup{
setup_button(40,1); //к примеру
setup_button(41,2); //к примеру}
Я понимаю, что этот фрагмент кода бредовый, видимо, но я пытаюсь понять можно ли функцией создать объект с уникальным именем. Поясняю: я пытаюсь разобраться. Весь смысл конкретно этого разрабатываемого скетча в том, чтобы снимать показания с джойстика, конкретно defender cobra r4. Обрабатывать получаемые данные и отправлять их по радиоканалу. Можете посмотреть что это за джой. Там 4 потенциометра и 13 вроде кнопок. С потенциоетрами понятно всё, а вот с кнопками ньюансы. Но так понимаю, что придётся каждую кнопку расписывать отдельно по крайней мере в setup.
У вас в голове каша. Я же скечь вам выложил. Скачайте и посмотрите, как классы организовал. Примитивно ведь организовал. Объявляете объекты, в сетапе даете индивидульные настройки , а в лупе работаете.
Объект надо создавать до 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Спасибо, я к этоу ещё вернусь! Но мне титан велик пока понятней. Попробую помудрить с таймерами.
Титановый велосипед попробую, только насчёт задержек повторного срабатывания кнопок не увидел. Наверно придётся доделывать. Под этим имею ввиду такой пример. Вы набрали текст в блокноте, допустим. Жмёте бэкспейс и держите. Комп вам не удаляет всё со скоростью работы процессора, а каждый символ с некоторой задержкой. Правда задержка тоже уменьшается, если замечали, но это не важно. Вот такой эффект нужен, а то зажму кеопку и в миг параметр наберёт нехилое значение.
и не увидишь - нет повода бороться и настраивать то, чего нет.
нажатие/отпускание кнопки порождает событие, актуальное в течении того цикла программы на который приходится нажатие/отпускание кнопки.
т.е. одно нажатие/одно отпускание - одно событие.
автоповтор отсутствует.
Bounce *setup_button(int pin) 25 { 26 Bounce *tmp = new Bounce(pin); . . // настройка кнопки tmp-> ляляля . return tmp; // и потом сохрани в каком-нить массиве штоли. 27 } присваиваешь потом Bounce *button = setup_button(2); обращение потом только сложнее. Вместо "button." придется писать "button->"Ну вот есть пример с таймером. Если изменить можно подогнать под то что я хочу. Правда вчера достаточно бегло посмотрел код велика, если функции не повторяют события при удержании кнопки- то вообще мне проще самому писать алгоритм срабатывания каждой кнопки.
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no.... Смотреть там, где речь заходит про таймер.
Правда вчера достаточно бегло посмотрел код велика, если функции не повторяют события при удержании кнопки- то вообще мне проще самому писать алгоритм срабатывания каждой кнопки.
можешь, просто, бегло идти нахуй и не ебать мне и форумчанам мосг.
Bounce *setup_button(int pin) 25 { 26 Bounce *tmp = new Bounce(pin); . . // настройка кнопки tmp-> ляляля . return tmp; // и потом сохрани в каком-нить массиве штоли. 27 } присваиваешь потом Bounce *button = setup_button(2); обращение потом только сложнее. Вместо "button." придется писать "button->"Клёвый код, я так понимаю здесь предложено создавать экземпляры класса динамически. Блин, не такой я топовый программер, чтобы конкретно понимать что здесь к чему, а хотелось бы. Если можно объясните подробнее конструкцию, пожалуйста.
Правда вчера достаточно бегло посмотрел код велика, если функции не повторяют события при удержании кнопки- то вообще мне проще самому писать алгоритм срабатывания каждой кнопки.
можешь, просто, бегло идти нахуй и не ебать мне и форумчанам мосг.
Это дело не хитрое, создай себе экземпляр и иди.
Я бы абяснил, канешна. Да только у мня нет библиотеки 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; }}}};
}
На сколько, понятно речь идёт о двух функциях внизу и массивами, которые с ними связаны.
48pinMode (pin,OUTPUT);pin чему равно?
48pinMode (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();
[мерзко хихикая ушёл спать]
физические кнопки динамически подключаются вкуда-подало пинам... что тогда? - сейчас это пин кнопки - нажал, и это уже пин светодиода. что тогда - как быть и вкуда бечь?
.. а вышел на улицу, а там динозав, от что тогда, что делать?
ПС. Спокойной ночи.
Вот она, рабочая задумка. Может кому пригодится.
#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;} }