замыкание/размыкание 2-х контактов через ардуино

lexai
Offline
Зарегистрирован: 14.10.2015

Pyotr пишет:

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 = бесконечность.
digitalWrite(11, LOW);
 
вот как мне нужно это сделать?
 
 
lexai
Offline
Зарегистрирован: 14.10.2015

с бесконечным циклом не получается (срабатывает первый пин) и затем уходит в этот бесконечный цикл и дальше не реагирует на кнопку вот пример что я вставлял

    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)

или проверка не нужна и нужно просто сделать какой-то простой счётчик?  ай нед хелп((((

 

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

hugo пишет:
Нельзя ардуионой "замыкать" контакты.

Чё эт нельзя то? Запросто можно! Только не нужно, ибо опасно это, и для ардуины, и для замыкающего..

b707
Онлайн
Зарегистрирован: 26.05.2017

не надо никаких бесконечных циклов, что за бред.

Надо добавить одну единственную переменную.  В момент нажатия кнопки ставите приравниваете ее 1., после переключения режима выставляете в ноль.

В режим добавляете условие. чтобы переключать его только при переменной == 1

Pyotr
Offline
Зарегистрирован: 12.03.2014

Вижу Вы моё сообщение совсем не поняли. Это делает следующее: если только что нажата кнопка, то что-то делаем однократно. Там и защита от дребезга, и текущее состояние кнопки, и 7 предыдущих состояний , и флаг - кнопка только что нажата.
 

pinMode(11, OUTPUT); // Между 11 пином и GND, R = ~26 Ом.
delay(500); //пол секунды (или даже меньше) замыкания для меня достаточно
pinMode(11, INPUT); // Между 11 пином и GND, R = бесконечность.
digitalWrite(11, LOW); // И снова Между 11 пином и GND, R = ~26 Ом.
-----------------
Вы это сознательно делаете?

 
lexai
Offline
Зарегистрирован: 14.10.2015

Pyotr пишет:

Вижу Вы моё сообщение совсем не поняли. Это делает следующее: если только что нажата кнопка, то что-то делаем однократно. Там и защита от дребезга, и текущее состояние кнопки, и 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);
}
lexai
Offline
Зарегистрирован: 14.10.2015

b707 пишет:

не надо никаких бесконечных циклов, что за бред.

Надо добавить одну единственную переменную.  В момент нажатия кнопки ставите приравниваете ее 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); 
}
    } 
   
 } 

Вроде как Вы говорили, но не работает

b707
Онлайн
Зарегистрирован: 26.05.2017

оператор присваивания "=" и оператор сравнения "==" - это разные операторы, а ты их путаешь

lexai
Offline
Зарегистрирован: 14.10.2015

b707 пишет:

оператор присваивания "=" и оператор сравнения "==" - это разные операторы, а ты их путаешь

Да, спасибо поправил пост 

я добился своего вот результат, может можно как-то оптимизировать?

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 часа, как я первый раз в жизни подключил Ардуину к компьютеру ) 

спасибо за советы и ответы всех откликнувшихся, приму конструктивную критику и замечания

Pyotr
Offline
Зарегистрирован: 12.03.2014

Без переменной flag никак не обойтись?

Покажу свой вариант без делай(). 

#define NO_PRESSED 0xFF //B11111111
#define CLICK_DOWN  B11111110
byte stateKey = NO_PRESSED, mode;
word currMillis, prevMillis, intervalMs = 40;
int  count_x40ms = -1;
const byte pinKey = 7;//кнопка на землю

void setup() {  
  pinMode(pinKey, INPUT_PULLUP);//тоже самое digitalWrite(pinKey, HIGH);
}

void loop() {
  currMillis = millis();
  if(currMillis - prevMillis >= intervalMs){
    prevMillis = currMillis;
    if(count_x40ms > -1) count_x40ms--;
    if(count_x40ms == 0){
      pinMode(10, INPUT);
      pinMode(11, INPUT);
      pinMode(13, INPUT); 
    }
    stateKey <<= 1;
    stateKey |= digitalRead(pinKey);  
    if(stateKey == CLICK_DOWN){
     //было нажатие - что-то делаем
      if(++mode > 3) mode = 0;
      
      if(mode==1){//первый режим 
        pinMode(10, OUTPUT); // Между 10 пином и GND, R = ~26 Ом.
        count_x40ms = 25;// = delay(1000); задержка 25*40=1000 мс
      } 
      if(mode==2){//второй режим  
        pinMode(11, OUTPUT); // Между 10 пином и GND, R = ~26 Ом.
        count_x40ms = 10;// = delay(400);        
      }
      if(mode==3){// 
        pinMode(13, OUTPUT); // Между 10 пином и GND, R = ~26 Ом.
        count_x40ms = 50;// = delay(2000);        
      }
    }   
  }
}

 

lexai
Offline
Зарегистрирован: 14.10.2015

попробую убрать из своего кода одну переменную flag т.к. они дублируют друг друга, возможно получиться

у Вас более сложный (и как я понимаю более верный) вариант кода лично для меня т.к. я ещё не изучил некоторые из этих операторов, но я попробую сделать пошаговую трасировку Вашего скетча (если это возможно в программе "Ардуино 1.8.9") и разберусь с операторами. Тут самый главный плюс в том, что нет паразитного "delay() который тормозит выполнение всей программы

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

lexai пишет:
добился своего вот результат, может можно как-то оптимизировать?

...

Зы) прошло ровно 24 часа, как я первый раз в жизни подключил Ардуину к компьютеру )

Правильное начало, главное правило ардуинщика не злоупотреблять delay(), а там все само пойдет  ))