переключение режимов 1 кнопкой
- Войдите на сайт для отправки комментариев
Втр, 10/10/2017 - 09:55
Здравствуйте, пытаюсь добавить режимы к данному коду идея простая 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));
}
}
целая тема есть работа с кнопками
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
там масса примеров
и вот например счетчик трех нажатий - убрать подсчет за три секунды, и просто переключать трежимы
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
я уже находил эти теммы не получается объединить код с первого сообщения и код ниже
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); //здесь может быть любое ваше действие } }наверное немного кривовато, но как то так
#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(); } } }работает СПАСИБО!
но у меня не получается вставить код в режимы
#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 Этот отчёт будет иметь больше информации с включенной опцией Файл -> Настройки -> "Показать подробный вывод во время компиляции"1. Вы вообще как с программированием?
Может быть имеет смысл нанять кого то?
Я не очень понимаю ваш код так как не знаю задачи.
2. Ошибки ваши относятся к синтаксису языку С - советую банальный букварь почитать.
С программированием туга пытась сам разобраться но мало что понимаю, нанимать не имеет смысл так как это для себя. А задача такова чтобы включалось реле еще одной кнопкой на 1 режиме 5сек на 2режиме 7сек на 3режиме 10сек на 4режиме 12сек если поможете заранее благодарен
#7 Так же делается и на 4. Вот только поймете ли скетч Там же #18
http://arduino.ru/forum/programmirovanie/vrode-s-taimerami-razobralsya-n...
Буквально сегодня уже обсуждали автомат состояний - ваш вариант. Т е вы задачу до этого не до конца описали. И соответственно мой пример не подходит никак. Составьте таблицу состояний / действий. Почитайте литературу. Никто за вас код писать не будет.
всем спасибо буду дальше искать пробовать