избавиться от delay ()

saftik
Offline
Зарегистрирован: 08.04.2015

Уважаемые специалисты програмисты АРДУИНЩИКИ. 
Помогите пожалуйста  новичку избавиться от функции Delay ().

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

 
/*
 ИДЕОЛОГИЯ:
  После нажатия кнопки включается реле, и запускаеться таймер. 
  после повторного нажатия реле выключаеться и останавливается таймер.
  затем расчитываю продолжительность работы реле.
  ОБНОВЛЕНИЕ :
  Планирую 
  1) Избавиться от делай
  2) Сохранить переменную "pausa" в EEPROM 

*/
# define relePin   10   // выход управления реле (на 10 пине)
# define buttonPin 2    // вход для кнопки . кнопка подключена к пину 2

  boolean  flag = 0;        // переменная для того чтоб видить запущено ли реле
  long unsigned onTime =0;  // первое нажатие "Старт"
  long unsigned offTime=0;  // второе нажатие "Стоп"

  
void setup() {
  
   Serial.begin(9600);          // запускаем сериал монитор на скорости 9600 bits per second:
   pinMode(relePin, OUTPUT);    // 10 пин как выход реле
   pinMode(buttonPin, INPUT);   // 2 пин как вход кнопки
}

  void loop () {
    
    if(digitalRead(2)==HIGH&&flag==0) // если кнопка нажата и flag =0  (и реле выключено)
 { 
    digitalWrite(10,HIGH);     // запустить реле
    flag=1;                    // запомнить что реле вкдючено
    onTime = millis()-onTime;  // начать считать 
    delay(500);                // защита от дребезга
 }
   if(digitalRead(2)==HIGH && flag==1) // если кнопка нажата и flag =1  (и реле работает)
 { 
   digitalWrite(10,LOW);       // выключить реле.
  
   flag=0;                     // запомнить что реле выключено
   offTime = millis()-offTime; // закончили считать
   delay(500);                 // защита от дребезга
  
   long unsigned pausa = offTime - onTime; // расчитываю продолжительность работы реле
 
  Serial.print("onTime");
  Serial.println (onTime);
  Serial.print("offTime");
  Serial.println (offTime);
  Serial.print("pausa");
  Serial.println (pausa);
  offTime =0; // обнуляем 
  onTime =0;  // счетчики 
}

} 
  

 

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

в чём вопрос-то ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

...голова не варит уже :(
это так - для начала, нужно доделывать

# define relePin 10               // выход управления реле
# define buttonPin 2              // вход для кнопки, кнопка подключена к GND и пину 2
boolean  statusRelay=0;           // переменная для того чтоб видить запущено ли реле
long unsigned onTimeRelay;        // время нажатия вкл реле
long unsigned offTimeRelay;       // время нажатия выкл реле
//================================================================
void setup()
{
   Serial.begin(9600);
   pinMode(relePin, OUTPUT);
   digitalWrite(relePin,LOW);       // выключить реле
   pinMode(buttonPin,INPUT);
   digitalWrite(buttonPin,HIGH);    // включить резистор подтяжки пина к VCC
}
//================================================================
void loop ()
{
// обработка кнопки
  if(digitalRead(buttonPin)==0)
  {
    delay(75);                                // защита от дребезга
    while(digitalRead(buttonPin)==0) { }      // ждём отпускания кнопки
    if(!statusRelay)
    {
      statusRelay=!statusRelay;
      digitalWrite(relePin,statusRelay);
      offTimeRelay=millis();
    }
    else
    {
      statusRelay=!statusRelay;
      digitalWrite(relePin,statusRelay);
      onTimeRelay=millis();
    }
  }
// вывод
  Serial.print("onTime = ");
  Serial.println (onTimeRelay);
  Serial.print("offTime = ");
  Serial.println (offTimeRelay);
  Serial.print("Pausa = ");
  Serial.println (offTimeRelay-onTimeRelay);
}
//================================================================

 

saftik
Offline
Зарегистрирован: 08.04.2015

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

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

забыл добавить , конпку подтягиваю к земле через резистор 10 кОм

кстати, по мере продвижения появляються вопросы

1)как реализовать аварийный стоп? (нажал кнопку и все остановилось не важно какой процесс выполняеться(в моем случае реле))

2) как пользоваться функцией stop?

пишу в редакторе слово stop оно подсвечиваеться красным, стало быть есть такая функция в arduino /
хотел почитать как ей пользоваться но гугл дает только англоязычные сайты.

 

всем спасибо за понимание и подсказки

 

saftik
Offline
Зарегистрирован: 08.04.2015

Спасибо Буду разбираться