Срочно! Нужна помощи написания скетча

ArtMaster
Offline
Зарегистрирован: 16.04.2019

Здравствуйте!

Помогите пожалуйста новичку написать скетч. Необходимо к плате MEGA 2560 подключить 10 кнопок с выходом на 10 реле (у каждой кнопкий свое реле) с таймером на каждом канале 60 сек. Что бы при включении кнопки №1 запускалось  реле №1 и через 60 сек выключалось, и при нажатии на эту или другую кнопку таймер (60 сек.) обновлялся и запускалось только то реле которое привязано к кнопке.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ArtMaster пишет:
и при нажатии на эту или другую кнопку таймер (60 сек.) обновлялся и запускалось только то реле которое привязано к кнопке.

Правильно ли я понимаю:

1. Если нажали на ту же кнопку, что уже нажимали менее минуты назад, то с реле не происходит ничего, а отсчёт 60 сек начинается с нуля (т.е. мы просто продлеваем работу реле).

2. Если нажали на другую кнопку, то включённое в данный момент реле выключается, а включается на минуту реле, соответсвующее нажатой кнопке?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Правильно ли я понимаю, что перед сдачей курсовой булки уже даже не подгорают, а горят прям ярким пламенем? 

ArtMaster
Offline
Зарегистрирован: 16.04.2019

ЕвгенийП пишет:

ArtMaster пишет:
и при нажатии на эту или другую кнопку таймер (60 сек.) обновлялся и запускалось только то реле которое привязано к кнопке.

Правильно ли я понимаю:

1. Если нажали на ту же кнопку, что уже нажимали менее минуты назад, то с реле не происходит ничего, а отсчёт 60 сек начинается с нуля (т.е. мы просто продлеваем работу реле).

2. Если нажали на другую кнопку, то включённое в данный момент реле выключается, а включается на минуту реле, соответсвующее нажатой кнопке?

Да, все верно.

ArtMaster
Offline
Зарегистрирован: 16.04.2019

Да, все верно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дед, да какая это курсовая? Это максимум - домашка на одном и самых первых занятий.  Но ТС в правильный раздел обратился. Кто-нить сделает (если Ворота не устроит срач и тему не снесут).

vvadim
Offline
Зарегистрирован: 23.05.2012

не, на первом только светодиодики, а тут кнопки и таймеры.... - где то второе или даже третье.
тс не указал почту, куда ему программу скинут.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ну, срочно спасать чужие булки - дело очень недешевое.  думаю, тыщ в 8 тебе абайдёца.

bwn
Offline
Зарегистрирован: 25.08.2014

Не, 8 это только за кнопки, за реле, со скидкой, по 300 за штуку, плюс таймеры посчитать, наерна по 10 руб за кажную секунду. От. Уговорили, берусь за 15 тыров. Тока 2560 у меня нет, предлагаю на 168 или покупка за счет ТС. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Младший у меня студент ....

Птичку жалко :(

// ноги кнопок
#define KEY_PIN_0 10
#define KEY_PIN_1 11
#define KEY_PIN_2 12
#define KEY_PIN_3 13
#define KEY_PIN_4 14
#define KEY_PIN_5 15
#define KEY_PIN_6 16
#define KEY_PIN_7 17
#define KEY_PIN_8 18
#define KEY_PIN_9 19

// ноги реле
#define RELAY_PIN_0 20 
#define RELAY_PIN_1 21
#define RELAY_PIN_2 22
#define RELAY_PIN_3 23
#define RELAY_PIN_4 24
#define RELAY_PIN_5 25
#define RELAY_PIN_6 26
#define RELAY_PIN_7 27
#define RELAY_PIN_8 28
#define RELAY_PIN_9 29

// состояния реле
#define REALY_OFF HIGH
#define REALY_ON  LOW

// период пока реле включено
#define RELAY_ON_PERIOD 60000

// устранение дребезга
#define DEBOUNCE 50

// массив реле
byte relays[]={RELAY_PIN_0,RELAY_PIN_1,RELAY_PIN_2,RELAY_PIN_3,RELAY_PIN_4,RELAY_PIN_5,RELAY_PIN_6,RELAY_PIN_7,RELAY_PIN_8,RELAY_PIN_9};

// массив кнопок
byte keys[]={KEY_PIN_0,KEY_PIN_1,KEY_PIN_2,KEY_PIN_3,KEY_PIN_4,KEY_PIN_5,KEY_PIN_6,KEY_PIN_7,KEY_PIN_8,KEY_PIN_9};
bool oldStateKey[sizeof(keys)]={false};

void setup() {
   // инициализация реле и кнопок
   for(byte i=0; i<sizeof(relays); i++){
      // кнопки подключены с ноги на землю
      // если кнопка нажата читаем из порта 0
      pinMode(keys[i],INPUT_PULLUP); //подтяжка
      pinMode(relays[i],OUTPUT); // ноги управления реле на выход
      digitalWrite(relays[i],REALY_OFF); // размыкаем реле
   }
}

void loop() {
   static byte loopCounter=0;
   // таймер реле
   static unsigned long relay_timer=0;
   // таймер кнопок
   static unsigned long key_timer=0;
   if(digitalRead(keys[loopCounter]==LOW)){ // кнопка нажата
      if (oldStateKey[loopCounter]){ // и была нажата ранее
         if(millis()-key_timer>DEBOUNCE){ // дребезг по нажатию отфильтровали
            // кнопка нажата
            for(byte i=0;i<sizeof(relays);i++){
               if(i!=loopCounter){ // если реле не соответвтсвует кнопке
                  digitalWrite(relays[i],REALY_OFF); // размыкаем его
               }
            }
            digitalWrite(relays[loopCounter],REALY_ON); // реле соответствубщее кнопке - замыкаем
            relay_timer=millis();
         }
      } else { // ранее нажата не была
         oldStateKey[loopCounter]=true; // запоминаем новое состояние кнопки
         key_timer=millis(); // запоминаем время нажатия     
      }
   } else { // кнопка не нажата, просто запомним ее состояние
      oldStateKey[loopCounter]=false;    
   }
   // контроль таймера реле, поскольку других задач нет, можно не экономить ресурсы
   if(millis()-relay_timer>=RELAY_ON_PERIOD){ // если период удержания реле истек
      for(byte i=0;i<sizeof(relays);i++){
         digitalWrite(relays[i],REALY_OFF); // размыкаем все реле          
      }
   }
   // контроль циклического счетчика опроса кнопок
   if(loopCounter<sizeof(keys)-1){
      loopCounter++;     
   } else {
      loopCounter=0;     
   }
}

Может и ошибся где, всего то 15 минут потратил. Но на тройку то я сделал, надеюсь. Кстати тут и уно с наной подойдут.

 

 

ArtMaster
Offline
Зарегистрирован: 16.04.2019

Всем спасибо! Вопрос решен. Тему можно закрыть.