Написать программный код таймера для Arduino

Flicker
Offline
Зарегистрирован: 17.10.2021

Всем Привет! Нужна ваша помощь в написании скетча для ардуино.

Задача: При нажатии на кнопку включается модуль реле, и отсчитывает 7 секунд, после этого, выключается.

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

Имеется Arduino nano, модуль реле.

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

500р

Flicker
Offline
Зарегистрирован: 17.10.2021

Каким образом, куда?

b707
Offline
Зарегистрирован: 26.05.2017

Flicker пишет:

Каким образом, куда?

спишетесь с исполнителем, договоритесь

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

Подожди до вечера, придёт Бармалей, скажет куда ему писать. 

Green
Offline
Зарегистрирован: 01.10.2015

Хорошо бы... пива. 500р htpicc@gmail.com

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

А вапще, зачем ты за ардуино взялся, если даже такой простейший код написать не можешь?  Мошт тебе проще на рассыпухе таймер собрать, логика простейшая

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Уже студенты потянулись ?

Flicker
Offline
Зарегистрирован: 17.10.2021

Учи русский и мат часть

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

Flicker пишет:

Учи русский и мат часть

только этим и занимаюсь, батюшка.  С утра до ночи. 

b707
Offline
Зарегистрирован: 26.05.2017

Flicker пишет:

Учи русский и мат часть

хм, а матчасть то тут причем?

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

b707 пишет:

хм, а матчасть то тут причем?

Ни при чём. ТС же ясно сказал

Flicker пишет:

мат часть

b707
Offline
Зарегистрирован: 26.05.2017

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

ТС же ясно сказал

Flicker пишет:

мат часть

стесняюсь спросить, какую часть мата учить?

Flicker
Offline
Зарегистрирован: 17.10.2021

Ну да, вы были правы, залез в литературу.

    Проще кода нет.

         Просто я никогда не программировал, а с железом сталкивался много.

               Пожалуй напишу сам.

                      Всем спасибо!

b707
Offline
Зарегистрирован: 26.05.2017

Flicker пишет:

               Пожалуй напишу сам.

                      Всем спасибо!

Вот что 500рублей с человеком делают!

Flicker
Offline
Зарегистрирован: 17.10.2021

Не в деньгах дело, а во времени. Он сказал что бармалей к вечеру только придет. А до вечера я наверное и сам управлюсь. Если нет, отпишусь.

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

Flicker пишет:

к вечеру только 

Так в #5 же Вам дали контакт! Я думал, что давно уж всё сделано!

Кстати, если выложите подтверждение перечисления 450 руб. вот сюда, то я Вам за эти 450 руб. сделаю Ваше упражнение

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014
#define PIN_BUTTON 2
#define PIN_RELAY  LED_BUILTIN
#define RELAY_ON   LOW
#define RELAY_OFF  HIGH
#define BUTTON_PRESSED LOW
#define BUTTON_UNPRESSED HIGH
#define BUTTON_DEBOUCE_DELAY 30
#define RELAY_HOLD_DELAY 7000 

uint8_t buttonOldStat=0xFF;
uint8_t buttonStat=0xFF;
uint32_t debounceButtonTimer=0; 
uint32_t holdRelayTimer=0;

void setup() {
  pinMode(PIN_BUTTON,INPUT_PULLUP);
  pinMode(PIN_RELAY,OUTPUT);
  digitalWrite(PIN_RELAY,RELAY_OFF);
}

void loop() {
  uint8_t buttonTempStat=digitalRead(PIN_BUTTON);
  uint32_t _now=millis();
  if(buttonOldStat!=buttonTempStat){ // изменилость состояние кнопки
     buttonOldStat=buttonTempStat; 
     debounceButtonTimer=_now; // перезасекаем таймер дребезга
  } else if(debounceButtonTimer && _now-debounceButtonTimer>BUTTON_DEBOUCE_DELAY){ 
     // истек период антидребезга, и состояние кнопки не менялось
     debounceButtonTimer=0;
     if(buttonStat!=buttonTempStat){ // момент нажатия или отпускания с погашеным дребезгом
        buttonStat=buttonTempStat; 
        if(buttonStat==BUTTON_PRESSED){ // кнопку нажали
           if(digitalRead(PIN_RELAY)==RELAY_OFF){ // реле выключено
              digitalWrite(PIN_RELAY,RELAY_ON); // включить реле
              holdRelayTimer=_now; // зарядить таймер     
           } else { // кнопку отпустили
              digitalWrite(PIN_RELAY,RELAY_OFF); // выключить реле
              holdRelayTimer=0; // отключить таймер реле   
           }
        }
     }
  }

  if(holdRelayTimer && _now-holdRelayTimer>=RELAY_HOLD_DELAY){
     digitalWrite(PIN_RELAY,RELAY_OFF); // выключить реле
     holdRelayTimer=0; // отключить таймер реле   
  }

}

Вот наговнокодил. Деньги по ссылке Евгения.

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

Судя по комментам все поняли, что ТС не студент. Как вам это удалось определить?

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

А я не понял. За то написал так, что препод поймет что он сделал не сам :) И за пару вопросов убедится в этом, ну а что будет дальше уже решит сам эскулап.

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Я пришёл , пишите, если сами не управились.  !00 рублей. Торг уместен. 

Дет Симён  разрешил.

barmaley2m@yandex.ru

kolyn
Offline
Зарегистрирован: 18.01.2019

Flicker пишет:

Задача: При нажатии на кнопку включается модуль реле, и отсчитывает 7 секунд, после этого, выключается.

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

brokly пишет:

Вот наговнокодил. Деньги по ссылке Евгения.

А я ТЗ понял по другому - это действие должно выполниться только один раз.

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

Ну может быть и так.  Только это странно. Решается очень просто. while(1) вроде пока не отменили ? Ж)

kolyn
Offline
Зарегистрирован: 18.01.2019

brokly пишет:

Ну может быть и так.  Только это странно. Решается очень просто. while(1) вроде пока не отменили ? Ж)

Так препод  красоту _переменной оценит, а зачет не поставит))

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

А, ну наверное можно было бы и так понять ТЗ, даже наверное - нужно, но я не такой сообразительный :)