lexai, вот простой пример опроса кнопки. Попробуйте разобраться. Дальше допишите сами, что нужно делать при нажатии кнопки.
Для меня это ещё сложно, мне нужно допилить мой скетч, по сути я добился переключения, но у меня то замыкается, то размыкается, мне нужно допилить внутри условия
если подключить слабую нагрузку типа светодиода то он то замыкается то размыкается и так далее на каждом пине при переключении кнопкой, вот что нужно допилить:
pinMode(11, OUTPUT); // Между 11 пином и GND, R = ~26 Ом.
delay(500); //пол секунды (или даже меньше) замыкания для меня достаточно
pinMode(11, INPUT); // Между 11 пином и GND, R = бесконечность.
digitalWrite(11, LOW);
у меня тут то замыкается на пол секунды а потом размыкается и так подряд
а мне нужно чтобы после замыкания на пол секунды было размыкание т.е. как-то "зациклить"
вот это :
pinMode(11, INPUT); // Между 11 пином и GND, R = бесконечность.
с бесконечным циклом не получается (срабатывает первый пин) и затем уходит в этот бесконечный цикл и дальше не реагирует на кнопку вот пример что я вставлял
pinMode(10, OUTPUT); // Между 10 пином и GND, R = ~26 Ом.
delay(1500);
for (;;) { //зацикливаем размыкание
pinMode(10, INPUT); // Между 10 пином и GND, R = бесконечность.
digitalWrite(10, LOW);
}
как оказалось не работает (( ((((
значит при моём скетче нужно:
либо проверять состояние замыкания в алгоритме "если"
в начале ввожу переменную, к примеру "int flag2=0;
а дальше нужно проверять по аналогии замкнут или нет if(digitalRead(10)==HIGH&&flag2==0)
или проверка не нужна и нужно просто сделать какой-то простой счётчик? ай нед хелп((((
Вижу Вы моё сообщение совсем не поняли. Это делает следующее: если только что нажата кнопка, то что-то делаем однократно. Там и защита от дребезга, и текущее состояние кнопки, и 7 предыдущих состояний , и флаг - кнопка только что нажата.
pinMode(11, OUTPUT); // Между 11 пином и GND, R = ~26 Ом.
delay(500); //пол секунды (или даже меньше) замыкания для меня достаточно
pinMode(11, INPUT); // Между 11 пином и GND, R = бесконечность.
digitalWrite(11, LOW); // И снова Между 11 пином и GND, R = ~26 Ом.
Вижу Вы моё сообщение совсем не поняли. Это делает следующее: если только что нажата кнопка, то что-то делаем однократно. Там и защита от дребезга, и текущее состояние кнопки, и 7 предыдущих состояний , и флаг - кнопка только что нажата.
pinMode(11, OUTPUT); // Между 11 пином и GND, R = ~26 Ом.
delay(500); //пол секунды (или даже меньше) замыкания для меня достаточно
pinMode(11, INPUT); // Между 11 пином и GND, R = бесконечность.
digitalWrite(11, LOW); // И снова Между 11 пином и GND, R = ~26 Ом.
-----------------
Вы это сознательно делаете?
нет, взял из этой темы выше :
// Скетч примера замыкания слаботочной цепи <20мА и <=5В пинами Ардуины.
int pin_D2 = 2;
void setup() {
}
void loop() {
// "Кнопка" отжата, цепь разомкнута.
pinMode(pin_D2, INPUT); // Между D2 и GND, R = бесконечность.
delay(3222);
// Эмулируем нажатие на замыкающую цепь кнопку.
pinMode(pin_D2, OUTPUT); // Между D2 и GND, R = ~26 Ом.
digitalWrite(pin_D2, 0);
delay(222);
}
Надо добавить одну единственную переменную. В момент нажатия кнопки ставите приравниваете ее 1., после переключения режима выставляете в ноль.
В режим добавляете условие. чтобы переключать его только при переменной == 1
int regim=1;
int flag=0;
int flag2=0;
void setup() {
}
void loop()
{
if(digitalRead(2)==HIGH&&flag==0&&flag2==0)//если кнопка нажата
// и перемення flag равна 0 , то ...
{
regim++;
flag=1;
flag2=1;
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
// плюс защита от "дребезга" 100%
if(regim>3)//ограничим количество режимов
{
regim=1;//так как мы используем только одну кнопку,
// то переключать режимы будем циклично
}
}
if(digitalRead(2)==LOW&&flag==1&&flag2==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
flag=0; //обнуляем переменную "knopka"
flag2=0; //обнуляем переменную
}
if(regim==1)//первый режим
{
if(flag2=1)//первый режим кнопка нажата
{
pinMode(10, OUTPUT); // Между 10 пином и GND, R = ~26 Ом.
delay(1500);
}
else
{
pinMode(10, INPUT); // Между 10 пином и GND, R = бесконечность.
digitalWrite(10, LOW);
}
}
if(regim==2)//второй режим
{
if(flag2=1)//2 режим кнопка нажата
{
pinMode(11, OUTPUT); // Между 11 пином и GND, R = ~26 Ом.
delay(1500);
}
else
{
pinMode(11, INPUT); // Между 11 пином и GND, R = бесконечность.
digitalWrite(11, LOW);
}
}
if(regim==3)//третий режим
{
if(flag2=1)//первый режим кнопка нажата
{
pinMode(8, OUTPUT); // Между 8 пином и GND, R = ~26 Ом.
delay(1500);
}
else
{
pinMode(8, INPUT); // Между 8 пином и GND, R = бесконечность.
digitalWrite(8, LOW);
}
}
}
оператор присваивания "=" и оператор сравнения "==" - это разные операторы, а ты их путаешь
Да, спасибо поправил пост
я добился своего вот результат, может можно как-то оптимизировать?
int regim=1;
int flag=0;
int flag2=0;
void setup() {
}
void loop()
{
if(digitalRead(2)==HIGH&&flag==0&&flag2==0)//если кнопка нажата
// и перемення flag равна 0 , то ...
{
regim++;
flag=1;
flag2=1;
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
// плюс защита от "дребезга" 100%
if(regim>3)//ограничим количество режимов
{
regim=1;//так как мы используем только одну кнопку,
// то переключать режимы будем циклично
}
}
if(digitalRead(2)==LOW&&flag==1&&flag2==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
flag=0; //обнуляем переменную "knopka"
flag2=0; //обнуляем переменную
}
if(regim==1&&flag2==1) //первый режим кнопка нажата
{
pinMode(10, OUTPUT); // Между 10 пином и GND, R = ~26 Ом.
delay(500);
}
if(regim==1&&flag2==0) //первый режим кнопка не активна
{
pinMode(10, INPUT); // Между 10 пином и GND, R = бесконечность.
}
if(regim==2&&flag2==1)//второй режим кнопка нажата
{
pinMode(11, OUTPUT); // Между 11 пином и GND, R = ~26 Ом.
delay(500);
}
if(regim==2&&flag2==0) //второй режим кнопка не активна
{
pinMode(11, INPUT); // Между 11 пином и GND, R = бесконечность.
}
if(regim==3&&flag2==1) //третий режим
{
pinMode(8, OUTPUT); // Между 8 пином и GND, R = ~26 Ом.
delay(500);
}
if(regim==3&&flag2==0) // третий режим кнопка не активна
{
pinMode(8, INPUT); // Между 8 пином и GND, R = бесконечность.
}
}
Зы) прошло ровно 24 часа, как я первый раз в жизни подключил Ардуину к компьютеру )
спасибо за советы и ответы всех откликнувшихся, приму конструктивную критику и замечания
попробую убрать из своего кода одну переменную flag т.к. они дублируют друг друга, возможно получиться
у Вас более сложный (и как я понимаю более верный) вариант кода лично для меня т.к. я ещё не изучил некоторые из этих операторов, но я попробую сделать пошаговую трасировку Вашего скетча (если это возможно в программе "Ардуино 1.8.9") и разберусь с операторами. Тут самый главный плюс в том, что нет паразитного "delay() который тормозит выполнение всей программы
lexai, вот простой пример опроса кнопки. Попробуйте разобраться. Дальше допишите сами, что нужно делать при нажатии кнопки.
Для меня это ещё сложно, мне нужно допилить мой скетч, по сути я добился переключения, но у меня то замыкается, то размыкается, мне нужно допилить внутри условия
если подключить слабую нагрузку типа светодиода то он то замыкается то размыкается и так далее на каждом пине при переключении кнопкой, вот что нужно допилить:
с бесконечным циклом не получается (срабатывает первый пин) и затем уходит в этот бесконечный цикл и дальше не реагирует на кнопку вот пример что я вставлял
либо проверять состояние замыкания в алгоритме "если"
в начале ввожу переменную, к примеру "int flag2=0;
а дальше нужно проверять по аналогии замкнут или нет
if
(digitalRead(10)==HIGH&&flag2==0)
или проверка не нужна и нужно просто сделать какой-то простой счётчик? ай нед хелп((((
Чё эт нельзя то? Запросто можно! Только не нужно, ибо опасно это, и для ардуины, и для замыкающего..
не надо никаких бесконечных циклов, что за бред.
Надо добавить одну единственную переменную. В момент нажатия кнопки ставите приравниваете ее 1., после переключения режима выставляете в ноль.
В режим добавляете условие. чтобы переключать его только при переменной == 1
Вижу Вы моё сообщение совсем не поняли. Это делает следующее: если только что нажата кнопка, то что-то делаем однократно. Там и защита от дребезга, и текущее состояние кнопки, и 7 предыдущих состояний , и флаг - кнопка только что нажата.
Вы это сознательно делаете?
Вижу Вы моё сообщение совсем не поняли. Это делает следующее: если только что нажата кнопка, то что-то делаем однократно. Там и защита от дребезга, и текущее состояние кнопки, и 7 предыдущих состояний , и флаг - кнопка только что нажата.
Вы это сознательно делаете?
нет, взял из этой темы выше :
не надо никаких бесконечных циклов, что за бред.
Надо добавить одну единственную переменную. В момент нажатия кнопки ставите приравниваете ее 1., после переключения режима выставляете в ноль.
В режим добавляете условие. чтобы переключать его только при переменной == 1
Вроде как Вы говорили, но не работает
оператор присваивания "=" и оператор сравнения "==" - это разные операторы, а ты их путаешь
оператор присваивания "=" и оператор сравнения "==" - это разные операторы, а ты их путаешь
Да, спасибо поправил пост
я добился своего вот результат, может можно как-то оптимизировать?
Зы) прошло ровно 24 часа, как я первый раз в жизни подключил Ардуину к компьютеру )
спасибо за советы и ответы всех откликнувшихся, приму конструктивную критику и замечания
Без переменной flag никак не обойтись?
Покажу свой вариант без делай().
попробую убрать из своего кода одну переменную flag т.к. они дублируют друг друга, возможно получиться
у Вас более сложный (и как я понимаю более верный) вариант кода лично для меня т.к. я ещё не изучил некоторые из этих операторов, но я попробую сделать пошаговую трасировку Вашего скетча (если это возможно в программе "Ардуино 1.8.9") и разберусь с операторами. Тут самый главный плюс в том, что нет паразитного "delay() который тормозит выполнение всей программы
Зы) прошло ровно 24 часа, как я первый раз в жизни подключил Ардуину к компьютеру )
Правильное начало, главное правило ардуинщика не злоупотреблять delay(), а там все само пойдет ))