переключение режимов 1 кнопкой

Dmitriy.E.S
Offline
Зарегистрирован: 09.10.2017

Здравствуйте, пытаюсь добавить режимы к данному коду идея простая 4 режима и на каждом свое время включение реле, режимы переключаются кнопкой1 без фиксации 4 светодиода индикаторы. На первом режиме горит светодиод1 при нажатии кнопки2 без фиксации включается реле на 3 сек во втором режиме горят светодиод1,2 и реле работает 5 сек. Пытался найти примеры но запутываюсь в защите от дребезга кнопок с ардуино еще знаком поверхностно прошу строго не судить


bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
bool _kp1 = 0;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _ktim1 = 0;
bool _bounseInput2S = 0;
bool _bounseInput2O = 0;
unsigned long _bounseInput2P = 0UL;
int R = 3;
void setup()
{
  pinMode(R, OUTPUT);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
  pinMode(13, OUTPUT);

  _bounseInput2O =  digitalRead(2);
}
void loop()
{
  digitalWrite(R, HIGH);
  bool  _bounceTmp2 =  (digitalRead (2));

  if (_bounseInput2S) 
  {
    if (millis() >= (_bounseInput2P + 40)) 
    {
      _bounseInput2O= _bounceTmp2; 
      _bounseInput2S=0;
    }
  }
  else
  {
    if (_bounceTmp2 != _bounseInput2O )
    {
      _bounseInput2S=1; 
      _bounseInput2P = millis();
    } 
  } 

  if((!_bounseInput2O)&& (!(_ktim1))){
    _kp1 = 1;
  }
  if(_ktim1&& (!((!_bounseInput2O)))){
    _kp1 = 0;
  }
  if (_kp1)
  { 
    if (_tim1I) { 
      if (_isTimer(_tim1P, 7000)) {
        _tim1O = 1;
      }
    } 
    else {
      _tim1I =1; 
      _tim1P = millis();
    }
  } 
  else {
    _tim1O = 0; 
    _tim1I = 0;
  }
  if(_tim1O)
  {
    _ktim1 = 1;
  }
  else
  {
    _ktim1 = 0;
  }
  if (_kp1) {
    if (! _gen1I){
      _gen1I = 1; 
      _gen1O = 1; 
      _gen1P = millis();
    }
  } 
  else { 
    _gen1I = 0 ; 
    _gen1O= 0; 
  } 
  if (_gen1I &&  _gen1O)   _gen1O = !( _isTimer( _gen1P , 7000 ));
  if(_gen1O)
  {
    digitalWrite (13, 1);
  }
  else
  {
    digitalWrite (13, 0);
  }
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
  unsigned long currentTime;
  currentTime = millis();
  if (currentTime>= startTime) {
    return (currentTime>=(startTime + period));
  } 
  else {
    return (currentTime >=(4294967295-startTime+period));
  }
}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

целая тема есть работа с кнопками

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...

там масса примеров

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

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...

 

Dmitriy.E.S
Offline
Зарегистрирован: 09.10.2017

я уже находил эти теммы не получается  объединить код с первого сообщения и код ниже

int regim=1; 
 int flag=0; 

 void setup()   
 { 
    pinMode(10,OUTPUT);    
 pinMode(9,OUTPUT);    
       
 } 

 void loop() 

 { 
       
     if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата   
     // и перемення flag равна 0 , то ... 
     { 
       regim++;   
       flag=1; 
         
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
          
        if(regim>4)//ограничим количество режимов 
        { 
          regim=1;//так как мы используем только одну кнопку, 
                    // то переключать режимы будем циклично 
        } 
       
     } 
       
      if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
          
        flag=0;//обнуляем переменную "knopka" 
     } 
      
       
       
    if(regim==1)//первый режим 
    { 
      digitalWrite(9,LOW);//выключаем все светодиоды 
      digitalWrite(10,LOW); 
        
        
      //здесь может быть любое ваше действие 
    } 
    if(regim==2)//второй режим 
    { 
      digitalWrite(10,HIGH);//включае красный светодиод 
      digitalWrite(9,LOW); 
        
      //здесь может быть любое ваше действие 
    } 
      
    if(regim==3)//третий режим 
    { 
        
      digitalWrite(9,HIGH);//включае зеленый светодиод 
      digitalWrite(10,LOW); 
        
        
      //здесь может быть любое ваше действие 
    } 
      
    if(regim==4)//четвертый режим 
    { 
        
      digitalWrite(9,HIGH);//включаем светодиоды одновременно 
      digitalWrite(10,HIGH); 
      //здесь может быть любое ваше действие 
    } 
      
 } 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

наверное немного кривовато, но как то так

#define DOWNKEY 50 // minimal time msec down key + 50 msec
#define UPKEY 300 // minimal time beetween key press
#define KEYPIN 2

boolean KeyDownStart = false;
unsigned long TimeKeyDownStart = 0;
unsigned long TimeModeStart = 0;
byte Mode = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(KEYPIN, INPUT);
  digitalWrite(KEYPIN, HIGH);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (digitalRead(KEYPIN) == 0) {
    unsigned long ts = millis() - TimeKeyDownStart;
    if (KeyDownStart) {
      if (ts >= DOWNKEY) {
        if (ts <= (DOWNKEY + 50)) {
          unsigned long mt = millis() - TimeModeStart;
          if (mt >= UPKEY) {
            TimeModeStart = millis();
            ++Mode;
            if (Mode > 4) {
              Mode = 1;
            }
            switch (Mode) {
              case 1 : {
                  Serial.println(Mode);
                  break;
                }
              case 2 : {
                  Serial.println(Mode);
                  break;
                }
              case 3 : {
                  Serial.println(Mode);
                  break;
                }
              case 4 : {
                  Serial.println(Mode);
                  break;
                }
              default : {
                }
            }
          }
          KeyDownStart = false;
        } else {
          KeyDownStart = false;
        }
      }
    } else {
      KeyDownStart = true;
      TimeKeyDownStart = millis();
    }
  }
}

 

Dmitriy.E.S
Offline
Зарегистрирован: 09.10.2017

работает СПАСИБО! 

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

#define DOWNKEY 50 // minimal time msec down key + 50 msec
#define UPKEY 300 // minimal time beetween key press
#define KEYPIN 2

boolean KeyDownStart = false;
unsigned long TimeKeyDownStart = 0;
unsigned long TimeModeStart = 0;
byte Mode = 0;

bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
bool _kp1 = 0;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _ktim1 = 0;
bool _bounseInput2S = 0;
bool _bounseInput2O = 0;
unsigned long _bounseInput2P = 0UL;

void setup() {
  // put your setup code here, to run once:
  pinMode(KEYPIN, INPUT);
  digitalWrite(KEYPIN, HIGH);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  Serial.begin(9600);
  pinMode(3, INPUT);
  digitalWrite(3, HIGH);
  pinMode(13, OUTPUT);

  _bounseInput2O =  digitalRead(2);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (digitalRead(KEYPIN) == 0) {
    unsigned long ts = millis() - TimeKeyDownStart;
    if (KeyDownStart) {
      if (ts >= DOWNKEY) {
        if (ts <= (DOWNKEY + 50)) {
          unsigned long mt = millis() - TimeModeStart;
          if (mt >= UPKEY) {
            TimeModeStart = millis();
            ++Mode;
            if (Mode > 4) {
              Mode = 1;
            }
            switch (Mode) {
              case 1 : {
                  Serial.println(Mode);
                  break;
                }
              case 2 : {
                  Serial.println(Mode);
                  {

                    bool  _bounceTmp2 =  (digitalRead (3));

                    if (_bounseInput2S)
                    {
                      if (millis() >= (_bounseInput2P + 40))
                      {
                        _bounseInput2O = _bounceTmp2;
                        _bounseInput2S = 0;
                      }
                    }
                    else
                    {
                      if (_bounceTmp2 != _bounseInput2O )
                      {
                        _bounseInput2S = 1;
                        _bounseInput2P = millis();
                      }
                    }

                    if ((!_bounseInput2O) && (!(_ktim1))) {
                      _kp1 = 1;
                    }
                    if (_ktim1 && (!((!_bounseInput2O)))) {
                      _kp1 = 0;
                    }
                    if (_kp1)
                    {
                      if (_tim1I) {
                        if (_isTimer(_tim1P, 7000)) {
                          _tim1O = 1;
                        }
                      }
                      else {
                        _tim1I = 1;
                        _tim1P = millis();
                      }
                    }
                    else {
                      _tim1O = 0;
                      _tim1I = 0;
                    }
                    if (_tim1O)
                    {
                      _ktim1 = 1;
                    }
                    else
                    {
                      _ktim1 = 0;
                    }
                    if (_kp1) {
                      if (! _gen1I) {
                        _gen1I = 1;
                        _gen1O = 1;
                        _gen1P = millis();
                      }
                    }
                    else {
                      _gen1I = 0 ;
                      _gen1O = 0;
                    }
                    if (_gen1I &&  _gen1O)   _gen1O = !( _isTimer( _gen1P , 7000 ));
                    if (_gen1O)
                    bool _isTimer(unsigned long startTime, unsigned long period )
                    {
                      digitalWrite (13, 1);
                    }
                    else
                    {
                      digitalWrite (13, 0);
                    }
                  }
                  bool _isTimer(unsigned long startTime, unsigned long period )
                  
                  {
                    unsigned long currentTime;
                    currentTime = millis();
                    if (currentTime >= startTime) {
                      return (currentTime >= (startTime + period));
                    }
                    else {
                      return (currentTime >= (4294967295 - startTime + period));
                    }
                  }
                  break;
                }
              case 3 : {
                  Serial.println(Mode);
                  break;
                }
              case 4 : {
                  Serial.println(Mode);
                  break;
                }
              default : {
                }
            }
          }
          KeyDownStart = false;
        } else {
          KeyDownStart = false;
        }
      }
    } else {
      KeyDownStart = true;
      TimeKeyDownStart = millis();
    }
  }
}

 

выбивает ошибку 

Arduino: 1.8.2 (Windows 10), Плата:"Arduino Nano, ATmega328" 

C:\Users\SSD\Documents\Arduino\_4re_rejima_v0\_4re_rejima_v0.ino: In function 'void loop()': 

_4re_rejima_v0:85: error: '_isTimer' was not declared in this scope 

if (_isTimer(_tim1P, 7000)) { 

^ 

_4re_rejima_v0:117: error: '_isTimer' was not declared in this scope 

if (_gen1I && _gen1O) _gen1O = !( _isTimer( _gen1P , 7000 )); 

^ 

_4re_rejima_v0:128: error: a function-definition is not allowed here before '{' token 

{ 

^ 

_4re_rejima_v0:161: error: expected '}' at end of input 

} 

^ 

_4re_rejima_v0:161: error: expected '}' at end of input 

_4re_rejima_v0:161: error: expected '}' at end of input 

_4re_rejima_v0:161: error: expected '}' at end of input 

_4re_rejima_v0:161: error: expected '}' at end of input 

_4re_rejima_v0:161: error: expected '}' at end of input 

_4re_rejima_v0:161: error: expected '}' at end of input 

exit status 1 
'_isTimer' was not declared in this scope 

Этот отчёт будет иметь больше информации с 
включенной опцией Файл -> Настройки -> 
"Показать подробный вывод во время компиляции"

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

1. Вы вообще как с программированием?
Может быть имеет смысл нанять кого то?
Я не очень понимаю ваш код так как не знаю задачи.
2. Ошибки ваши относятся к синтаксису языку С - советую банальный букварь почитать.

Dmitriy.E.S
Offline
Зарегистрирован: 09.10.2017

С программированием туга пытась сам разобраться но мало что понимаю, нанимать не имеет смысл так как это для себя. А задача такова чтобы включалось реле еще одной кнопкой на 1 режиме 5сек на 2режиме 7сек на 3режиме 10сек на 4режиме 12сек если поможете заранее благодарен 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

#7  Так же делается и на 4. Вот только поймете ли скетч Там же #18

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

http://arduino.ru/forum/programmirovanie/vrode-s-taimerami-razobralsya-n...

Буквально сегодня уже обсуждали автомат состояний - ваш вариант. Т е вы задачу до этого не до конца описали. И соответственно мой пример не подходит никак. Составьте таблицу состояний / действий. Почитайте литературу. Никто за вас код писать не будет.

Dmitriy.E.S
Offline
Зарегистрирован: 09.10.2017

всем спасибо буду дальше искать пробовать