Управление четырьмя релле через пульт 2262/2272

Sparkmaker
Offline
Зарегистрирован: 29.12.2020

Всем привет!

С помощью пульта, NANO, релейного блока и блока питания.

Собрал схему управления.

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

С помощью форума смог написать управление от каждой кнопки:

int knopkaA=0;
int knopkaB=0;
int knopkaC=0;
int knopkaD=0;

void setup ()
{
pinMode(8,OUTPUT);
pinMode(7,OUTPUT);
pinMode(6,OUTPUT);
pinMode(5,OUTPUT);
pinMode(10,INPUT);
pinMode(12,INPUT);
pinMode(9,INPUT);
pinMode(11,INPUT);

}

void loop ()
{//***************КНОПКА A********************************//


if(digitalRead(10)==HIGH&&knopkaA==0)//если кнопка нажата
// и перемення "knopka" равна 0 , то ...
{
delay(50);//защита от дребезга
knopkaA++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие

digitalWrite(8, !digitalRead(8));//меняем значение порта на противоположное

}

  if(digitalRead(10)==LOW&&knopkaA==1)//если кнопка НЕ нажата
//и переменная knopka равна - 1 ,то ...
{

knopkaA=0;//обнуляем переменную "knopka"
}



//***********************КНОПКА B*****************************//


if(digitalRead(12)==HIGH&&knopkaB==0)//если кнопка нажата
// и перемення "knopkaB" равна 0 , то ...
{
  delay(50);
  knopkaB++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
 
    digitalWrite(7,!digitalRead(7));  
}

if(digitalRead(12)==LOW&&knopkaB==1)//если кнопка НЕ нажата
//и переменная knopka2 равна - 1 ,то ...
{
    knopkaB=0;//обнуляем переменную "knopkaB"
}
//***********************КНОПКА C*****************************//


if(digitalRead(9)==HIGH&&knopkaC==0)//если кнопка нажата
// и перемення "knopkaC" равна 0 , то ...
{
  delay(50);
  knopkaC++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
 
    digitalWrite(6,!digitalRead(6));  
}

if(digitalRead(9)==LOW&&knopkaC==1)//если кнопка НЕ нажата
//и переменная knopka2 равна - 1 ,то ...
{
    knopkaC=0;//обнуляем переменную "knopkaB"
}
//***********************КНОПКА D*****************************//


if(digitalRead(11)==HIGH&&knopkaD==0)//если кнопка нажата
// и перемення "knopkaD" равна 0 , то ...
{
  delay(50);
  knopkaD++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
 
    digitalWrite(5,!digitalRead(5));  
}

if(digitalRead(11)==LOW&&knopkaD==1)//если кнопка НЕ нажата
//и переменная knopkaD равна - 1 ,то ...
{
    knopkaD=0;//обнуляем переменную "knopkaD"
}

} 

Работает.

Но есть необходимость при долгом нажатии кнопки А выключить все релле.

Помогите советом.

Благодарю заранее!

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Алгоритм такой:

при нажатии кнопки А запоминаем миллис.

добавляем еще один иф по условию - knopkaA++==1 И превышен интервал ожидания, тогда и включаем все реле

 

И еще - строка 26 и ей аналогичные, ИМХО, в Вашей программе смысла не имеют. Сами подумайте - от какого дребезга они защищают? Если хотите сделать правильно почитайте про работу с кнопками в прилепленой теме.

Sparkmaker
Offline
Зарегистрирован: 29.12.2020

Благодарю за помощь!

Заработало!

int knopkaA=0;
int knopkaAP=0; // кнопка А зажата 
int knopkaB=0;
int knopkaC=0;
int knopkaD=0;
int valBut = 0;                                  // Задаем переменную, для счетчика 
long previousMillis = 0;              // Зададим начальное значение для счетчика millis
long TimePush = 500;                 // Время нажатия на кнопку

void setup ()
{
pinMode(8,OUTPUT);
pinMode(7,OUTPUT);
pinMode(6,OUTPUT);
pinMode(5,OUTPUT);
pinMode(10,INPUT);
pinMode(12,INPUT);
pinMode(9,INPUT);
pinMode(11,INPUT);

}

void loop ()
{//***************КНОПКА A********************************//

if(digitalRead(10)==HIGH&&digitalRead(8)==HIGH&&knopkaAP==0)//если кнопка нажата
                                                            // реле включено и перемення "knopkaAP" равна 0 , то ...
  {                                                   //
      if(millis() - previousMillis  >=  1)                 // начинаем считать время нажатия
        {                                               //
          previousMillis = millis();                    //
          valBut++;                                     // с каждой миллисекундой увеличиваем значение valBut
        }           
    }
  
  else                                                  // если кнопку отпустили, то valBut становится равным 0
    {                                                   // это необходимо для защиты от срабатывания при частых
       valBut = 0;                                      // многократных нажатиях
    }
   
   if(valBut >= TimePush)                               // как только значение valLed становится равным TimtPush
    {                                                   //
       knopkaAP++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие

       digitalWrite(8, LOW);//выключаем порт
       digitalWrite(7, LOW);//выключаем порт
       digitalWrite(6, LOW);//выключаем порт
       digitalWrite(5, LOW);//выключаем порт
       valBut = 0;                                      //  и устанавливаем valBut = 0
    }        
else
if(digitalRead(10)==HIGH&&knopkaA==0)//если кнопка нажата
// и перемення "knopka" равна 0 , то ...
{

knopkaA++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие

digitalWrite(8, HIGH);//включаем порт

}

if(digitalRead(10)==LOW&&knopkaAP==1)//если кнопка НЕ нажата
//и переменная knopka равна - 1 ,то ...
{

knopkaAP=0;//обнуляем переменную "knopka"
}


      
if(digitalRead(10)==LOW&&knopkaA==1)//если кнопка НЕ нажата
//и переменная knopka равна - 1 ,то ...
{

knopkaA=0;//обнуляем переменную "knopka"
}



//***********************КНОПКА B*****************************//


if(digitalRead(12)==HIGH&&knopkaB==0)//если кнопка нажата
// и перемення "knopkaB" равна 0 , то ...
{
  
  knopkaB++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
 
    digitalWrite(7,!digitalRead(7));  
}

if(digitalRead(12)==LOW&&knopkaB==1)//если кнопка НЕ нажата
//и переменная knopka2 равна - 1 ,то ...
{
    knopkaB=0;//обнуляем переменную "knopkaB"
}
//***********************КНОПКА C*****************************//


if(digitalRead(9)==HIGH&&knopkaC==0)//если кнопка нажата
// и перемення "knopkaC" равна 0 , то ...
{
  
  knopkaC++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
 
    digitalWrite(6,!digitalRead(6));  
}

if(digitalRead(9)==LOW&&knopkaC==1)//если кнопка НЕ нажата
//и переменная knopka2 равна - 1 ,то ...
{
    knopkaC=0;//обнуляем переменную "knopkaB"
}
//***********************КНОПКА D*****************************//


if(digitalRead(11)==HIGH&&knopkaD==0)//если кнопка нажата
// и перемення "knopkaD" равна 0 , то ...
{
  
  knopkaD++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
 
    digitalWrite(5,!digitalRead(5));  
}

if(digitalRead(11)==LOW&&knopkaD==1)//если кнопка НЕ нажата
//и переменная knopkaD равна - 1 ,то ...
{
    knopkaD=0;//обнуляем переменную "knopkaD"
}

} 

Рабочий, для меня, вариант.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Не, не прокатит. С 36 по 38 строку - бред. Ну не сможете Вы нажимать кнопки быстрее чем проц читает. Поэтому фтопку. С 29 по 33 строку непонятно зачем. В предыдущей программе все было логично, но тут вносится сумятица. А чего к предыдущей программе не добавить лишний условный оператор? Кроме того Ваша переменная valBut только int, а Вы мерите long. А вдруг упертый дурак на кнопке? И вот Вам великое переполнение. Не выдумывайте х-ню, а пользуйтесь стандартным (Millis()-lastMillis)>чему-то там.

А дребезг решается конденсатором в параллель кнопки, причем так, что статистические методы нервно курят в углу. А уж LC цепочка...

Sparkmaker
Offline
Зарегистрирован: 29.12.2020

Уже прокатило и работает.

Я программист от бога, по этому это программный Франкенштейн собранный из разных уроков.

Кнопка исключительно для меня по этому городить различных защит не имеет смысла, на моего дурака хватит.

на добивание сама сборка:

Упакую в корпус, если вспомню, отчитаюсь.

Благодарю за советы в будущем учту.

С наступающими!