ШД 28byj-48 измененние скорости кнопкой. Поршу помощи.
- Войдите на сайт для отправки комментариев
Вс, 24/06/2018 - 20:22
Никак не заставлю меняться скорость при нажатии кнопки. Строки 39-45. Двигатель вращается вперед-назад с медленнной скоростью и иногда его нужно поторопить нажатием кннопки. Нажал- ускорился, отпустил - продолжил вращаться на прежней медленнной скорости. Скорость при нажатии не меняется. Можете объяснить бестолковому, что конкретнно не правильно?
#include <CustomStepper.h> // Подключаем библиотеку CustomStepper
CustomStepper stepper(3, 4, 5, 6); // Указываем пины, к которым подключен драйвер шагового двигателя
boolean rotate1 = false; // Переменная для смены режимов
boolean rotate2 = false; // Переменная для смены режимов
unsigned long currentTime;
unsigned long loopTime = currentTime;
char a = 1; //обороты
void setup()
{
stepper.setRPM(a); //количество оборотов в минуту
stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395
pinMode (9, OUTPUT); // фокус камеры
pinMode (10, OUTPUT); // затвор камеры
currentTime = millis(); // считываем время, прошедшее с момента запуска программы
digitalWrite(12, HIGH);
}
void loop()
{
if (stepper.isDone() && rotate1 == false)
{
stepper.setDirection(CCW); // направление вращения (по часовой)
stepper.rotate(19); //количество оборотов
rotate1 = true;
}
if (stepper.isDone() && rotate1 == true && rotate2 == false)
{
stepper.setDirection(CW); //направление вращения (против часовой)
stepper.rotate(19); //количество оборотов
rotate2 = true;
}
if (stepper.isDone() && rotate2 == true )rotate1 = false;
if (digitalRead(12) == HIGH) //кнопка не нажата - 1 об.мин
{
a = 1;
}
else { // кнопка нажата - 12 об.мин
a = 12;
}
stepper.run(); // инициия работы двигателя
camera();
}
void camera() // Фокусировка и затвор
{
currentTime = millis();
if (currentTime >= (loopTime + 2500)) // интервал (мс*2)
{ digitalWrite(9, !digitalRead(9));
loopTime = currentTime;
if (currentTime >= (loopTime + 500))
{
digitalWrite(10, !digitalRead(10));
}
loopTime = currentTime;
digitalWrite(10, !digitalRead(10));
digitalWrite(9, !digitalRead(9));
}
}
Вопрос #1: какой функцией задается скорость?
кнопка подключена к какому пину? Сделай его как вход. 19 строка pinMode (12, INPUT);
Скорость задается
stepper.setRPM(a); //количество оборотов в минуту
Строку 19 исправил, результат-0. Как был 1 оборот в минуту, так и остается не реагируя на кнопку.
stepper.setRPM(a); //количество оборотов в минуту
Вопрос #2: почему не задается скорость при обработке состояния кнопки?
Можно посмотреть схему подключения кнопки к пину 12.
Ну по поводу "Вопрос #2", я думал что достаточно будет указать что при нажатии переменная "а" с таким значением, при не нажатой кнопке с другим. Не получилось.
Схема подключения кнопки: 12 пин на землю. digitalWrite(12, INPUT_PULLUP);
Сильно не ругайте. Ардуино на руках недели 2. Пока все такими дебрями кажется
Переменная а =1, в сетупе у вас stepper.setRPM(a); количество оборотов , переместите ее в луп.
Ну по поводу "Вопрос #2", я думал что достаточно будет указать что при нажатии переменная "а" с таким значением, при не нажатой кнопке с другим. Не получилось.
Это тут так не работает. Хотите изменить что-то - вызывайте функцию.
строки 7 и 14. Так тоже не работает
void loop() { if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CCW); // направление вращения (по часовой) stepper.rotate(19); //количество оборотов stepper.setRPM(a); rotate1 = true; } if (stepper.isDone() && rotate1 == true && rotate2 == false) { stepper.setDirection(CW); //направление вращения (против часовой) stepper.rotate(19); //количество оборотов stepper.setRPM(a); rotate2 = true; } if (stepper.isDone() && rotate2 == true )rotate1 = false; if (digitalRead(12) == HIGH) //кнопка не нажата - 1 об.мин { a = 1; } else { // кнопка нажата - 12 об.мин a = 12; } stepper.run(); // инициия работы двигателя camera(); }Посмотрите это http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
второй рисунок
...а обработка нажатия кнопки где происходит?
строка 20
Подключение кнопки как на 2 рисунке.
#include <CustomStepper.h> // Подключаем библиотеку CustomStepper CustomStepper stepper(3, 4, 5, 6); // Указываем пины, к которым подключен драйвер шагового двигателя boolean rotate1 = false; // Переменная для смены режимов boolean rotate2 = false; // Переменная для смены режимов unsigned long currentTime; unsigned long loopTime = currentTime; void setup() { stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395 pinMode (9, OUTPUT); // фокус камеры pinMode (10, OUTPUT); // затвор камеры pinMode (12, INPUT); // кнопка currentTime = millis(); // считываем время, прошедшее с момента запуска программы } void loop() { if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CCW); // направление вращения (по часовой) stepper.rotate(19); //количество оборотов rotate1 = true; } if (stepper.isDone() && rotate1 == true && rotate2 == false) { stepper.setDirection(CW); //направление вращения (против часовой) stepper.rotate(19); //количество оборотов rotate2 = true; } if (digitalRead(12) == LOW) //кнопка не нажата - 1 об.мин { stepper.setRPM(1); //количество оборотов в минуту } else { // кнопка нажата - 12 об.мин stepper.setRPM(12); //количество оборотов в минуту } stepper.run(); // инициия работы двигателя camera(); } void camera() // Фокусировка и затвор { currentTime = millis(); if (currentTime >= (loopTime + 2500)) // интервал (мс*2) { digitalWrite(9, !digitalRead(9)); loopTime = currentTime; if (currentTime >= (loopTime + 500)) { digitalWrite(10, !digitalRead(10)); } loopTime = currentTime; digitalWrite(10, !digitalRead(10)); digitalWrite(9, !digitalRead(9)); } }Добрый вечер! Дико извиняюсь на поздний ответ. Огромное спасибо всем откликнувшимся. Исправленный скетч работает. Статью по ссылке прочитал и приведеннные примеры вдохнновили на небольшие изменения. Теперь кнопкой несколько скоростей переключать буду.
#include <CustomStepper.h> // Подключаем библиотеку CustomStepper CustomStepper stepper(3, 4, 5, 6); // Указываем пины, к которым подключен драйвер шагового двигателя boolean rotate1 = false; // Переменная для смены режимов boolean rotate2 = false; // Переменная для смены режимов unsigned long currentTime; unsigned long loopTime = currentTime; int flagSpeed = 0; int menu = 0; int Speed [4] = {1, 2, 5, 12}; //скорость вращения об/мин. void setup() { stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395 pinMode (9, OUTPUT); // фокус камеры pinMode (10, OUTPUT); // затвор камеры pinMode (12, INPUT); // кнопка "скорость" currentTime = millis(); // считываем время, прошедшее с момента запуска программы } void loop() // Постоянное вращение двигателя по часовой - против часовой { if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CCW); // направление вращения (по часовой) stepper.rotate(19); //количество оборотов rotate1 = true; } if (stepper.isDone() && rotate1 == true && rotate2 == false) { stepper.setDirection(CW); //направление вращения (против часовой) stepper.rotate(19); //количество оборотов rotate2 = true; } if (stepper.isDone() && rotate2 == true )rotate1 = false; // Переключение скоростей вращения 1й кнопкой if (digitalRead(12) == HIGH && flagSpeed == 0) //если кнопка нажата и перемення flagSpeed равна 0 , то ... { menu++; flagSpeed = 1; //с каждым нажатием кнопки происходит только одно действие и защита от "дребезга" if (menu > 3) //ограничим количество режимов { menu = 0; // одна кнопка - переключать режимы будем циклично } } if (digitalRead(12) == LOW && flagSpeed == 1) //если кнопка НЕ нажата и переменная flagSpeed равна - 1 ,то ... { flagSpeed = 0; //обнуляем переменную "knopka" } stepper.setRPM(Speed[menu]); stepper.run(); // инициия работы двигателя camera(); } void camera() // Фокусировка и затвор { currentTime = millis(); if (currentTime >= (loopTime + 2500)) // интервал (мс*2) { digitalWrite(9, !digitalRead(9)); loopTime = currentTime; if (currentTime >= (loopTime + 500)) { digitalWrite(10, !digitalRead(10)); } loopTime = currentTime; digitalWrite(10, !digitalRead(10)); digitalWrite(9, !digitalRead(9)); } }Дальше доколдую с кнопкой старт-стоп и дисплеем. Еще раз огромное спасибо!
Дребезг подавляется не совсем корректно. Вам нужно повторно проверять состояние кнопки не только по флагу, а и через некоторое время, когда дребезг успокоится. Начнем с минимума 8 мс. Способ проверки у вас уже реализован в стр.65. Сделайте по тому же принципу, только условие более правильно изображать как (millis() - lastCheckTime > interval). Инкремент переменной menu и установку скорости более продуктивно делать при повторной проверке состояния кнопки.
А можете просто конденсатор паралелльно контактам подсадить.
Добрый день. Не получается с дисплеем наколдовать. При выводе текущего значения скорости на дисплей проблемы начинаются. Двигатель останавливается при включении 12 об/мин. Кнопка работает, скорость переключается, на дисплее показания меняются, камера щелкает, а двигатель стоит до сброса платы.
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <CustomStepper.h> CustomStepper stepper(3, 4, 5, 6); // Пины, к которым подключен драйвер шагового двигателя boolean rotate1 = false; // Переменная для смены режимов вращения (по часовой) boolean rotate2 = false; // Переменная для смены режимов вращения (против часовой) LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей unsigned long currentTime = 0; unsigned long loopTime = currentTime; bool button_state = false; // Состояние кнопки "скорость" unsigned long ms_button = 0; byte menu = 0; byte Speed [4] = {1, 2, 5, 12}; //скорость вращения об/мин. void setup() { lcd.init(); lcd.backlight(); // Включаем подсветку дисплея lcd.setCursor(0, 0); lcd.print("Speed: prm"); lcd.setCursor(6, 0); lcd.print(Speed[0]); stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395 pinMode (9, OUTPUT); // фокус камеры pinMode (10, OUTPUT); // затвор камеры pinMode (12, INPUT); // кнопка "скорость" currentTime = millis(); // считываем время, прошедшее с момента запуска программы } void loop() // ----------------Постоянное вращение двигателя по часовой - против часовой------------ { if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CCW); // направление вращения (по часовой) stepper.rotate(2); //количество оборотов rotate1 = true; } if (stepper.isDone() && rotate1 == true && rotate2 == false) { stepper.setDirection(CW); //направление вращения (против часовой) stepper.rotate(2); //количество оборотов rotate2 = true; } if (stepper.isDone() && rotate2 == true ) { rotate1 = false; rotate2 = false; } camera(); stepper.setRPM(Speed[menu]); stepper.run(); // инициия работы двигателя // ----------------Переключение скоростей вращения 1й кнопкой------------------------- unsigned long ms = millis(); // Фиксируем нажатие кнопки if ( digitalRead(12) == HIGH && !button_state && ( ms - ms_button ) > 15 ) { button_state = true; ms_button = ms; menu++; if (menu > 3) //ограничим количество режимов { menu = 0; } lcd.setCursor(6, 0); lcd.print(Speed[menu]); lcd.print(" "); } // Фиксируем отпускание кнопки if ( digitalRead(12) == LOW && button_state && ( ms - ms_button ) > 15 ) { button_state = false; ms_button = ms; } } void camera() // Фокусировка и затвор { currentTime = millis(); if (currentTime >= (loopTime + 2500)) // интервал (мс*2) { digitalWrite(9, !digitalRead(9)); loopTime = currentTime; if (currentTime >= (loopTime + 500)) { digitalWrite(10, !digitalRead(10)); } loopTime = currentTime; digitalWrite(10, !digitalRead(10)); digitalWrite(9, !digitalRead(9)); } }Пробовал сделать так:
unsigned long ms = millis(); // Фиксируем нажатие кнопки if ( digitalRead(12) == HIGH && !button_state && ( ms - ms_button ) > 15 ) { button_state = true; ms_button = ms; menu++; if (menu > 3) //ограничим количество режимов { menu = 0; } } // Фиксируем отпускание кнопки if ( digitalRead(12) == LOW && button_state && ( ms - ms_button ) > 15 ) { button_state = false; ms_button = ms; lcd.setCursor(6, 0); lcd.print(Speed[menu]); lcd.print(" "); }Сдается мне, что LSD тут непричем, просто алгоритм написан неправильно и задержка при выводе на дисплей ломает всё.
Поставьте вместо lcd.print-ов loop() скажем что-то типа delay(5);
Попробуй с дисплеем перед тем как выводить информацию очищай его.
lcd.clear(); //очистить дисплей lcd.setCursor(6, 0); lcd.print(Speed[menu]); lcd.print(" ");Очистка дисплея не помогла. Результат то же. Этот же эффект достигается и delay(5) вместо lcd.print-ов в loop(), но уже гораздо чаще (на любом нажатии может остановиться). "Вылечилось" так:
// Фиксируем нажатие кнопки if ( digitalRead(12) == HIGH && !button_state && ( ms - ms_button ) > 15 ) { button_state = true; ms_button = ms; menu++; if (menu > 3) //ограничим количество режимов { menu = 0; } lcd.setCursor(6, 0); stepper.run(); lcd.print(Speed[menu]); stepper.run(); lcd.print(" "); }Перед каждым lcd.print нужно подпинывать двигатель командой run(). Стоит убрать любую из них и опять остановка на последнем положении. Пробовал последнюю скорость задать однозначным числом, менял тип переменной, выносил lcd.print просто в loop() и все равно остановка именнно на последнем значении. С delay(5) останавливатся произвольно.
Значится проблема в алгоритме. Нужно сесть и еще раз подумать, написать все с чистого листа.
Всем добрый вечер и удачного продолжения выходных!
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include "sav_button.h" #include <CustomStepper.h> CustomStepper stepper(3, 4, 5, 6); // Пины, к которым подключен драйвер шагового двигателя boolean rotate1 = false; // Переменная для смены режимов вращения (по часовой) boolean rotate2 = false; // Переменная для смены режимов вращения (против часовой) LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей byte Start_step = 0; byte menu_speed = 0; byte Speed [4] = {1, 2, 5, 10}; //скорость вращения об/мин. byte Start_shoot = 0; byte menu_interval = 0; int Interval [3] = {1000, 2500, 4500}; //интервал съемки SButton button1(11, 100, 1000, 0, 0); // кнопка №1. (интервал/съемка). SButton button2(12, 100, 1000, 0, 0); // кнопка №2. (скорость/пуск). unsigned long previousMillis = 0; void setup() { lcd.init(); lcd.backlight(); // Включаем подсветку дисплея lcd.setCursor(0, 0); lcd.print("Speed: prm"); lcd.setCursor(6, 0); lcd.print(Speed[0]); lcd.setCursor(0, 1); lcd.print("Int. : sec"); lcd.setCursor(6, 1); lcd.print(((Interval[0]) * 2) / 1000); stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395 pinMode (9, OUTPUT); // фокус камеры pinMode (10, OUTPUT); // затвор камеры button1.begin(); //инициализация кнопки №1 button2.begin(); //инициализация кнопки №2 } void loop() { { ////////////////////////////////////////////////////////////////////////////////////////// // -------------Постоянное вращение двигателя против часовой - по часовой---------------// if (stepper.isDone() && rotate1 == false && Start_step == 1) { stepper.setDirection(CCW); // направление вращения (против часовой) stepper.rotate(2); //количество оборотов rotate1 = true; } if (stepper.isDone() && rotate1 == true && rotate2 == false && Start_step == 1) { stepper.setDirection(CW); //направление вращения (по часовой) stepper.rotate(2); //количество оборотов rotate2 = true; } if (stepper.isDone() && rotate2 == true && rotate1 == true ) { rotate1 = false; rotate2 = false; } stepper.setRPM(Speed[menu_speed]); stepper.run(); // инициация работы двигателя if (Start_shoot == 1)camera(); if (Start_step == 0)stepper.setDirection(STOP); } { /////////////////////////////////////////////////////////////////////////////////////////////// // -------------------Установка интервала и запуск съемки 1й кнопкой-------------------------// switch ( button1.Loop() ) { case SB_CLICK: // Фиксируем короткое нажатие кнопки №1 menu_interval++; if (menu_interval > 2) //ограничим количество режимов { menu_interval = 0; } lcd.setCursor(6, 1); stepper.run(); lcd.print(((Interval[menu_interval]) * 2) / 1000); stepper.run(); lcd.print(" "); stepper.run(); break; case SB_LONG_CLICK: // Фиксируем длинное нажатие кнопки №1 Start_shoot++; if (Start_shoot > 1) // количество режимов { Start_shoot = 0; } break; } } { /////////////////////////////////////////////////////////////////////////////////////////////// // -------------Пуск двигателя и переключение скоростей вращения 2й кнопкой------------------// switch ( button2.Loop() ) { case SB_CLICK: // Фиксируем короткое нажатие кнопки №2 menu_speed++; if (menu_speed > 3) // количество режимов { menu_speed = 0; } lcd.setCursor(6, 0); stepper.run(); lcd.print(Speed[menu_speed]); stepper.run(); lcd.print(" "); stepper.run(); break; case SB_LONG_CLICK: // Фиксируем длинное нажатие кнопки №2 Start_step++; if (Start_step > 1) // количество режимов (1-пуск/0-стоп) { Start_step = 0; } break; } } } void camera() // Фокусировка и затвор { unsigned long currentMillis = millis (); if (currentMillis >= (previousMillis + (Interval[menu_interval]))) { previousMillis = currentMillis; digitalWrite(9, !digitalRead(9)); if (currentMillis >= (previousMillis + 300)) { digitalWrite(10, !digitalRead(10)); } previousMillis = currentMillis; digitalWrite(10, !digitalRead(10)); digitalWrite(9, !digitalRead(9)); } }Все равно подозрение что дело в дисплее.
Уже эмпирическим путем установил, что если максимальная скорость 10 оборотов и интервал 9 секунд, то все нормально работает. Стоит вывести на экран 11 (оборотов) или 10 (секунд) и опять остановка.
Согласен, что мне до полной оптимизации алгоритма еще далеко, но вот совсем простой пример:
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <CustomStepper.h> CustomStepper stepper(3, 4, 5, 6, (byte[]) { 8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 }, 4075.7728395, 12, CW); boolean rotate1 = false; LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { lcd.init(); lcd.backlight(); stepper.setRPM(12); stepper.setSPR(4075.7728395); } void loop() { if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CCW); stepper.rotate(); } lcd.setCursor(0, 0); lcd.print(1); stepper.run(); }Двигатель вообще не стартанет, пока не убрать строку 28. Что единичка выводится, что любая буква. Пробовал выводить число по ннажатию кнопки. Доходит до двухзначного числа и остановка. Вывод информации на дисплей останавливает двигатель. Есть вообще разница в скорости работы и вывода символов от того, как он подключен? Шлейфом проводов или по i2c?
З даётся мне , что пока человек вообще не ведает, что творит, алгоритмы не при чем.
То есть, если оставить в лупе только run() - мотор будет крутится?
Да, если оставить только run() ,то крутится.
Если понизить скорость до 9 оборотов, то работает и с lcd.print. Все таки получается, что чем выше скорость вращения, тем чаще нужно отправлять stepper.run.
В моем скетче без дисплея на максимальной скорости в 12 оборотов можно выбрать любой интервал съемки. Хоть 2, хоть 10 секнд и все работает. Но при выводе двухзначного числа на дисплей при большой скорости вращения происходит остановка. Сейчас нашел компромисс с максимальной скоростью 10 оборотов и интервалом в 9 секунд. Пока работает, но это полумеры. Стоит вывести показания счетчика отснятых кадров, они дойдут скажем до трехзначного числа и все опять встанет.
если не секрет - что снимаете и чем?
Вобщем, все понятно. Вы выбрали неудачную библиотеку. Насколько я понимаю - их метод измерения задержек между степами несколько неудачен и шагание происходит, только если run() вызывается в некоторый промежуток времени после начала движения. Задержки выросли - в "окно шага" вызов функции не попадает, мотор не шагает. Калькуляция этого "окна шага" происходит внутри библиотеки и синхронизироваться с ней непросто (да и смысла нет). Странный, вобщем, этот CustomStepper. Или я чего-то не понимаю в алгоритме работы этой либы.
если не секрет - что снимаете и чем?
Таймлапсами загорелся. Снимаю обычной старой цифромыльницей. Разобрал корпус и подпаял проводки к кнопке затвора (нужной функции из коробки нет) и ардуино периодически кадры щелкает. Вот захотелость в движении поснимать. Интересный эффект получается.
а когда движение по двум осям так вообще круто будет)))))
Извините за нескромность: какого года у Вас Порш?
Извините за нескромность: какого года у Вас Порш?
наверно тему попутал)))))
Теперь мне даже интересно - кто тут из рукоделов на порше гоняет.
Данет же, в теме ясно написано "поршу"
поршу нет лр да.
можешь скинуть скетч с работающей кнопкой на почту ? Stepan163s@ya.ru
Никак не заставлю меняться скорость при нажатии кнопки. Строки 39-45. Двигатель вращается вперед-назад с медленнной скоростью и иногда его нужно поторопить нажатием кннопки. Нажал- ускорился, отпустил - продолжил вращаться на прежней медленнной скорости. Скорость при нажатии не меняется. Можете объяснить бестолковому, что конкретнно не правильно?
#include <CustomStepper.h> // Подключаем библиотеку CustomStepper CustomStepper stepper(3, 4, 5, 6); // Указываем пины, к которым подключен драйвер шагового двигателя boolean rotate1 = false; // Переменная для смены режимов boolean rotate2 = false; // Переменная для смены режимов unsigned long currentTime; unsigned long loopTime = currentTime; char a = 1; //обороты void setup() { stepper.setRPM(a); //количество оборотов в минуту stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395 pinMode (9, OUTPUT); // фокус камеры pinMode (10, OUTPUT); // затвор камеры currentTime = millis(); // считываем время, прошедшее с момента запуска программы digitalWrite(12, HIGH); } void loop() { if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CCW); // направление вращения (по часовой) stepper.rotate(19); //количество оборотов rotate1 = true; } if (stepper.isDone() && rotate1 == true && rotate2 == false) { stepper.setDirection(CW); //направление вращения (против часовой) stepper.rotate(19); //количество оборотов rotate2 = true; } if (stepper.isDone() && rotate2 == true )rotate1 = false; if (digitalRead(12) == HIGH) //кнопка не нажата - 1 об.мин { a = 1; } else { // кнопка нажата - 12 об.мин a = 12; } stepper.run(); // инициия работы двигателя camera(); } void camera() // Фокусировка и затвор { currentTime = millis(); if (currentTime >= (loopTime + 2500)) // интервал (мс*2) { digitalWrite(9, !digitalRead(9)); loopTime = currentTime; if (currentTime >= (loopTime + 500)) { digitalWrite(10, !digitalRead(10)); } loopTime = currentTime; digitalWrite(10, !digitalRead(10)); digitalWrite(9, !digitalRead(9)); } }отпиши мне в вк https://vk.com/solovyovphotoshop