Привет всем подскажите пожалуйста как мне написать алгоритм работы нажатых кнопак
В данный момент код работает так нажимаешь на первую кнопку скважность 200, нажимаешь на вторую кнопку не отпуская первую скважность прыгает 200 до 190, или с кажем нажимаешь 3 и 6 вместе скважность начинает прыгать с 180 до 150.
Подскажите как сделать чтобы скважность читалась только по верхней кнопке не зависимо в каком порядке они были нажаты
Пример нажимаю 1.2.5 вместе не зависимо в каком порядке кнопку скважность читается только по 5, нажимаешь 4.5.6 скважность читается только по 6. или 1.3 скважность только по 3.
int ledPin = 9; // выход сигнала
int dataPin = 11; // Вывод данных 165
int clockPin = 12; // Вывод время 165
int loadPin = 13; // Вывод выбора 165
boolean val[9] = {0,0,0,0,0,0,0,0};
void setup()
{
pinMode(ledPin, OUTPUT); пин 9 на выход
pinMode(dataPin, INPUT); // Ввод 165.
pinMode(clockPin, OUTPUT); // Ввод время 165.
pinMode(loadPin, OUTPUT); // Вывод load 165.
}
void loop()
{
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
for(int i=1; i<8; i++){ // читаем 8 входов 165
digitalWrite(clockPin, 0); // время лог 0
val[i] = digitalRead(dataPin); // читаем состояние 165
digitalWrite(clockPin, 1); // время лог 1
}
if (val[1]== 1){
int fadeValue = 200 ; // скважность 200
analogWrite(ledPin, fadeValue); // выводим на выход
}
if (val[2]== 1){
int fadeValue = 190 ; // скважность 190
analogWrite(ledPin, fadeValue); // выводи на выход
}
if (val[3]== 1){
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
}
if (val[4]== 1){
int fadeValue = 170 ;
analogWrite(ledPin, fadeValue);
}
}
if (val[1,2,3]== 1){ // Если нажимаем и держим три кнопки одновременно приходит 1,2,3 то выполняем команду в фигурных скобках //
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
И так тоже
else if (val[1,2,3]== 1){ // Если нажимаем и держим три кнопки одновременно приходит 1,2,3 то выполняем команду в фигурных скобках//
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
int ledPin = 9;
int dataPin = 11; // Вывод данных 165
int clockPin = 12; // Вывод время 165
int loadPin = 13; // Вывод выбора 165
boolean val[9] = {0,0,0,0,0,0,0,0};
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(dataPin, INPUT); // Ввод 165.
pinMode(clockPin, OUTPUT); // Ввод время 165.
pinMode(loadPin, OUTPUT); // Вывод load 165.
}
void loop()
{
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
for(int i=1; i<9; i++){ // читаем 8 входов 165
digitalWrite(clockPin, 0); // время лог 0
val[i] = digitalRead(dataPin); // читаем состояние 165
digitalWrite(clockPin, 1); // время лог 1
}
if (val[1]== 1){ // если приходит 1 то выполняем команду в фигурных скобках//
int fadeValue = 200 ;
analogWrite(ledPin, fadeValue);
}
if (val[1,2,3]== 1){ // если приходит 1,2,3 то выполняем команду в фигурных скобках//
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
if (val[2]== 1){ // если приходит 2 то выполняем команду в фигурных скобках//
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
}
if (val[3]== 1){
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
}
if (val[4]== 1){
int fadeValue = 170 ;
analogWrite(ledPin, fadeValue);
}
if (val[1]== 1){
int fadeValue = 200 ;
analogWrite(ledPin, fadeValue);
if (val[2]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
if (val[3]== 1){
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
if (val[4]== 1){
int fadeValue = 170 ;
analogWrite(ledPin, fadeValue);
if (val[15]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
if (val[17]== 1){
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue
if (val[1,0,0,0,0,0,0,0]== 1){
int fadeValue = 200 ;
analogWrite(ledPin, fadeValue);
if (val[0,1,0,0,0,0,0,0]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
if (val[1,1,0,0,0,0,0,0]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
Максим подскажи пожалуйста как биты с регистра сдвиг анне посредственно привязать
if (val[1,0,0,0,0,0,0,0]== 1){
int fadeValue = 200 ;
analogWrite(ledPin, fadeValue);
if (val[0,1,0,0,0,0,0,0]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
if (val[1,1,0,0,0,0,0,0]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
Я вот смотрю и не могу понять вы чего хотите добиться от своего код??? откоментируйте строки, что бы было ясно чего вы хотите от той или иной строки и опишите что вообще пытаетесь сделать - алгоритм работы.
берем сохранённые данныё с дата ( с регистра сдвига)
и делим на 8 частей и присваиваем каждой цифру по возрастанию
Нажимаем первую кнопку
if (val[2]== 1){ // если есть принятый символ 2 //
int fadeValue = 190 ; // то выполняем действие //
analogWrite(ledPin, fadeValue); // отправляем на пин 9//
Нажимаем две кнопки одновременно 1 и 2
if (val[1]== 1 && val[2]==1){ // если есть принятый символ 1-2 //
int fadeValue = 190 ; // то выполняем действие //
но когда нажимаешь две кнопки одновременно скважность прыгает от 200 до 190
вот я и спрашиваю как мне сделать что бы можно было вставлять все восемь бит как мне привязать код к ним я думаю так скачков не будит
как их все проверять в одном
if (val[1,0,0,0,0,0,0,0]== 1){
// принятые биты с регистра сдвига ( 1,0,0,0,0,0,0,0,0) нажата первая кнопка//
int fadeValue = 200 ; // скважность 200 //
analogWrite(ledPin, fadeValue); // отправляем на пин 9//
if (val[0,1,0,0,0,0,0,0]== 1){
// принятые биты с регистра сдвига ( 0,1,0,0,0,0,0,0,0) нажата вторая кнопка//
int fadeValue = 190 ; // скважность 190 //
analogWrite(ledPin, fadeValue); // отправляем на пи 9//
if (val[1,1,0,0,0,0,0,0]== 1){
// принятые биты с регистра сдвига ( 1,1,0,0,0,0,0,0,0) // нажаты первая и вторая кнопка вместе //
int fadeValue = 190 ; // скважность 190 //
analogWrite(ledPin, fadeValue); //отправляем на пин 9//
Извини Максим за столь наверно для тебя глупые вопросы, Я в течения дня по мучаюсь по мучаюсь так по делаю и так и патом снова на форум за советом ,когда не чего не получается.
void loop()
{
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
val = shiftIn(dataPin, clockPin, MSBFIRST);
if (val == B10000000) fadeValue = 50 ;
// читаем 8 бит и если на 1 бите высокий уровень то отправляем скважность 50 на пин 9
if (val == B01000000) fadeValue = 190 ;
if (val == B00100000) fadeValue = 180 ;
if (val == B00010000) fadeValue = 170 ;
if (val == B00001000) fadeValue = 160 ;
if (val == B00001100) fadeValue = 150 ;
// читаем 8 бит и если на 5 и 6 бите высокий уровень то отправляем скважность 150 на пин 9
if (val == B00000010) fadeValue = 140 ;
if (val == B00000001) fadeValue = 10 ;
analogWrite(ledPin, fadeValue);
}
Всё работает практически идеально НО первый бит теряется точнее не первый а 8 ну в зависимости от LSBFIRST или MSBFIRST , первая кнопка или восьмая не какой реакции как будто биты сдвинуты
Цепляем последовательно два регистра сдвига
if (val == B00000000 || val == B10000000) fadeValue = 190 ;
и потерянный 8 бит у нас появляется в втором
|| val == B10000000
на остальные кнопки после 8 бита не какой реакции Подскажи пожалуйста как сделать чтобы два регистра работали в месте в чём причина что не хватает
Так и так уже пробовал и кучу других способ
if (val == B00000000 && val == B10000000) //ошибка
if (val == B00000000 .B10000000) // ошибка
if val { B00000000 , B10000000) // ошибка
if (val[0,0,0,0,0,0,0,0] || val[0,0,0,1,0,0,0,0 ) //ошибка
Ну что же Вы? ShiftIn - восьмибитная штука, а у Вас 16 кнопок! Вам нужно что-то в стиле:
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
val = shiftIn(dataPin, clockPin, MSBFIRST);
val=(val<<8)+ shiftIn(dataPin, clockPin, MSBFIRST); //сдвигаем на 8 бит влево, в младшие биты вписываем второй байт с регистров
if (val == B1000000000000000) fadeValue = 50 ;
// читаем 16 бит и если на 1 бите высокий уровень то отправляем скважность 50 на пин 9
Тип переменной val должен быть WORD или unsigned int или uint16_t соответственно
int dataPin = 11; // Вывод данных 165
int clockPin = 12; // Вывод время 165
int loadPin = 13; // Вывод выбора 165
byte val = 0, prev_val = 0;
void setup(){
Serial.begin(9600);
pinMode(dataPin, INPUT); // Ввод 165.
pinMode(clockPin, OUTPUT); // Ввод время 165.
pinMode(loadPin, OUTPUT); // Вывод load 165.
}
void loop(){
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165
if(val != prev_val){
Serial.println(val, BIN);
prev_val = val;
delay(200);
}
}
запустите сериал-монитор, пройдитесь по всем 8-ми кнопкам и покажите, что у вас выводится в сериал-монитор.
я такую же написал только немножко по другому
void loop(){
digitalWrite(inloadPin, 0);
digitalWrite(inloadPin, 1);
for(int i=0; i<=7; i++){ // читаем биты с 0 по 7 соответственно если пишем с 0 по 15 это 2 регистра параллельно
digitalWrite(inclockPin, 0);
temp = digitalRead(indataPin);
digitalWrite(inclockPin, 1);
Serial.print (temp);
}
Serial.println ("");
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
int dataPin = 11; // Вывод данных 165
int clockPin = 12; // Вывод время 165
int loadPin = 13; // Вывод выбора 165
byte val = 0, prev_val = 0;
void setup(){
Serial.begin(9600);
pinMode(dataPin, INPUT); // Ввод 165.
pinMode(clockPin, OUTPUT); // Ввод время 165.
pinMode(loadPin, OUTPUT); // Вывод load 165.
}
void loop(){
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165
if(val != prev_val){
Serial.println(val, BIN);
prev_val = val;
delay(200);
}
}
запустите сериал-монитор, пройдитесь по всем 8-ми кнопкам и покажите, что у вас выводится в сериал-монитор.
я такую же написал только немножко по другому
void loop(){
digitalWrite(inloadPin, 0);
digitalWrite(inloadPin, 1);
for(int i=0; i<=7; i++){ // читаем биты с 0 по 7 соответственно если пишем с 0 по 15 это 2 регистра параллельно
digitalWrite(inclockPin, 0);
temp = digitalRead(indataPin);
digitalWrite(inclockPin, 1);
Serial.print (temp);
}
Serial.println ("");
Вот вы почему такой упертый??? можете сделать как я вам написал и показать что у вас в сериал монитор выводится?
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
Могу предположить, что 74yc165 отдает бит по заднему фронту импульсов линии тактирования, а функция shiftIn читает по переднему фронту и первый бит теряется, но могу и ошибаться. Самое протое решение это отказаться от shiftIn и воспользоваться тем, что работает.
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
Тогда поопределять константы:
#define MB1000000000000000 (1<<15)
Можно тогда даже не константы объвлять, а прям в условиях двигать биты
Ну с другой стороны пускай он улетает один бит лишь бы он не влиял на остальную последовательность я понимаю что хвост будит первого регистра в начале второго
все работает как мне надо. Но есть одно но...
при нажатии первой загорается последний лед , а при нажатии последней кнопки - первый лед на ардуино
то есть кнопки считываются в обратном порядке.
Ребят, я конечно дико извиняюсь, что влажу со своими 2 копейками, но у меня просто порвался шаблон.....
Я так понимаю есть 8 лампочек и 8 выключателей к этим лампочкам... причем выключатели нормально замкнутые, когда нажимаеш на выключатель то цепь разрывается и лампочка гаснет, отпускаеш выключатель, цепь замыкается и лампочка загорается...
Причем тут вообще ардуино, схемы, программы и прочий бред на 4 страницы? Такими темпами, скоро начнете на держатель туалетной бамаги сервомотор прикручивать.. Но там хоть будет смысл какой то, типа по команде голосовой бамажка отматывалась что бы..
Привет всем подскажите пожалуйста как мне написать алгоритм работы нажатых кнопак
В данный момент код работает так нажимаешь на первую кнопку скважность 200, нажимаешь на вторую кнопку не отпуская первую скважность прыгает 200 до 190, или с кажем нажимаешь 3 и 6 вместе скважность начинает прыгать с 180 до 150.
Подскажите как сделать чтобы скважность читалась только по верхней кнопке не зависимо в каком порядке они были нажаты
Пример нажимаю 1.2.5 вместе не зависимо в каком порядке кнопку скважность читается только по 5, нажимаешь 4.5.6 скважность читается только по 6. или 1.3 скважность только по 3.
else if
не понимаю чего тут не хватает или ошибка в коде
Так не какой реакции
И так тоже
val[1,2,3] это что??? Массивы
if(val[1]== 1 || val[2]== 1 || val[3]== 1) или if(val[1]== 1 && val[2]== 1 && val[3]== 1)
Вынесите строчку analogWrite(ledPin, fadeValue); из условий после всех условий, что бы не плодить эту строку в каждом условии.
И нажмите Ctrl+T в Ардуино.
Спасибо
Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);
Вот так совершенно не реагирует на заданные кнопки if(val[1]== 1 || val[2]== 1 || val[3]== 1)
А вот так скважность меняется но всё равно не стабильно if(val[1]== 1 && val[2]== 1 && val[3]== 1)
прыгает скважность когда нажимаешь две кнопки одновременно
А когда одну то всё нормально, и как добиться такой стабильности при нажатие двух кнопка
Может это как то так сделать. Я образно магу мысль обрисовать и то не всегда.
Кнопка нажимаем по отдельность
1 - A - if (val[A]== 1 int fadeValue = 200 ;
2 - B - if (val[A]== 1 int fadeValue = 190 ;
3 - C - if (val[A]== 1 int fadeValue = 180 ;
4 - D - if (val[A]== 1 int fadeValue = 170 ;
Жмём две кнопки в месте 1-2 получаем В и от B идёт команда
1 |
| } B - if (val[A]== 1 int fadeValue = 190 ;
2 |
3 - C - if (val[A]== 1 int fadeValue = 180 ;
4 - D - if (val[A]== 1 int fadeValue = 170 ;
Или жмём три кнопки одновременно 1-2-3 получаем C и от C идёт команда
1 |
|
2 | } С - if (val[A]== 1 int fadeValue = 180 ;
|
3 |
4 - D - if (val[A]== 1 int fadeValue = 170 ;
Это наверно глупо выглядит?
Или как то так что ли привязать цифры
{1,0,0,0,0,0,0,0} - 1
{0,1,0,0,0,0,0,0} - 2
{0,0,1,0,0,0,0,0} - 3
{0,0,0,1,0,0,0,0} - 4
{1,1,0,0,0,0,0,0} – 15
{1,1,0,1,0,0,0,0} - 17
или так
Что бы восемь бит привязывать к команде
Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);
Объявите int fadeValue = 0; глобально, а не в каждом условии.
Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);
Объявите int fadeValue = 0; глобально, а не в каждом условии.
Так я уже делал , не на одну кнопку не реагирует
Я еже совсем запутался
Максим подскажи пожалуйста как биты с регистра сдвиг анне посредственно привязать
или так нельзя сделать
Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);
Объявите int fadeValue = 0; глобально, а не в каждом условии.
Так я уже делал , не на одну кнопку не реагирует
Не правильно делали.
Я вот смотрю и не могу понять вы чего хотите добиться от своего код??? откоментируйте строки, что бы было ясно чего вы хотите от той или иной строки и опишите что вообще пытаетесь сделать - алгоритм работы.
Максим подскажи пожалуйста как биты с регистра сдвиг анне посредственно привязать
или так нельзя сделать
У Вас 8-ми мерный массив?
Если хотите проверять отдельные биты и при этом не возиться с масками, читайте про функцию bitRead() - чтение отдельного бита.
Поясню для тех, у кого англиский - это китайский :)
Извини я про сто не силён в этих делах.
мы спомащью
берем сохранённые данныё с дата ( с регистра сдвига)
и делим на 8 частей и присваиваем каждой цифру по возрастанию
Нажимаем первую кнопку
analogWrite(ledPin, fadeValue); // отправляем на пин 9//
Нажимаем две кнопки одновременно 1 и 2
но когда нажимаешь две кнопки одновременно скважность прыгает от 200 до 190
вот я и спрашиваю как мне сделать что бы можно было вставлять все восемь бит как мне привязать код к ним я думаю так скачков не будит
как их все проверять в одном
Нажимаем втору кнопку
если последовательность будет обратной то LSBFIRST нужно поменять на MSBFIRST
да для меня он точно китайский
спасибо большое за помощь я бы целую вечность разбирался бы
Извини Максим за столь наверно для тебя глупые вопросы, Я в течения дня по мучаюсь по мучаюсь так по делаю и так и патом снова на форум за советом ,когда не чего не получается.
Всё работает практически идеально НО первый бит теряется точнее не первый а 8 ну в зависимости от LSBFIRST или MSBFIRST , первая кнопка или восьмая не какой реакции как будто биты сдвинуты
Цепляем последовательно два регистра сдвига
на остальные кнопки после 8 бита не какой реакции Подскажи пожалуйста как сделать чтобы два регистра работали в месте в чём причина что не хватает
Так и так уже пробовал и кучу других способ
В схеме всё нормально 100% проверил через
Serial.println все 16 бит реагируют на 16 кнопок
Вот вам тестилка для одного регистра:
запустите сериал-монитор, пройдитесь по всем 8-ми кнопкам и покажите, что у вас выводится в сериал-монитор.
Ну что же Вы? ShiftIn - восьмибитная штука, а у Вас 16 кнопок! Вам нужно что-то в стиле:
Тип переменной val должен быть WORD или unsigned int или uint16_t соответственно
Вот вам тестилка для одного регистра:
запустите сериал-монитор, пройдитесь по всем 8-ми кнопкам и покажите, что у вас выводится в сериал-монитор.
я такую же написал только немножко по другому
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
В тесте нужно пользоваться той же функцией, что и в программе! Поэтому важно использовать именно shiftIn()!
Вот вам тестилка для одного регистра:
запустите сериал-монитор, пройдитесь по всем 8-ми кнопкам и покажите, что у вас выводится в сериал-монитор.
я такую же написал только немножко по другому
Вот вы почему такой упертый??? можете сделать как я вам написал и показать что у вас в сериал монитор выводится?
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
Тогда поопределять константы:
Извиняюсь , запустил код н ереагирует на первую кнопку а на остальные пиши 1-10-100-100 и так далии
И еще раз! покажите что у вас в мониторе, скопируйте и вставьте сюда, неужели это так сложно...
Я просто подумал что эти две программ одинаковы по смыслу
сикнал кнопка
нет ответа 1
1 2
0
10 3
0
100 4
0
1000 5
0
10000 6
0
100000 7
0
1000000 8
0
Ясно, а если так:
так же
В тесте нужно пользоваться той же функцией, что и в программе! Поэтому важно использовать именно shiftIn()!
ну дак я же не знал этого
Могу предположить, что 74yc165 отдает бит по заднему фронту импульсов линии тактирования, а функция shiftIn читает по переднему фронту и первый бит теряется, но могу и ошибаться. Самое протое решение это отказаться от shiftIn и воспользоваться тем, что работает.
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
Тогда поопределять константы:
Можно тогда даже не константы объвлять, а прям в условиях двигать биты
Будим пробовать :-)
Ну с другой стороны пускай он улетает один бит лишь бы он не влиял на остальную последовательность я понимаю что хвост будит первого регистра в начале второго
попробуйте так:
попробуйте так:
А так всё читает с 1 по 8
Тогда выносим рабочий код в отдельную функцию SiftIn8bit
Для двух регистров есть два пути описаных выше.
1 вариант воспользоваться двумя переменными типа byte:
2 вариант воспользоваться одной переменной типа unsigned int:
Ну ты Макс профи, всё чудесно работает спасибо что помог и за то что пинка не дал)))
Вот состряпал код
все работает как мне надо. Но есть одно но...
при нажатии первой загорается последний лед , а при нажатии последней кнопки - первый лед на ардуино
то есть кнопки считываются в обратном порядке.
Почему?
Ребят, я конечно дико извиняюсь, что влажу со своими 2 копейками, но у меня просто порвался шаблон.....
Я так понимаю есть 8 лампочек и 8 выключателей к этим лампочкам... причем выключатели нормально замкнутые, когда нажимаеш на выключатель то цепь разрывается и лампочка гаснет, отпускаеш выключатель, цепь замыкается и лампочка загорается...
Причем тут вообще ардуино, схемы, программы и прочий бред на 4 страницы? Такими темпами, скоро начнете на держатель туалетной бамаги сервомотор прикручивать.. Но там хоть будет смысл какой то, типа по команде голосовой бамажка отматывалась что бы..
гы гы
Сейчас расскажу))