Работа с кнопками. В помощь новичку.

Evgufa
Evgufa аватар
Offline
Зарегистрирован: 19.03.2016

Спасибо всем. я просто чет истерю иногда))) все заработало, пояснения вроде все поправил)))

пульт буду припиливать уже не сегодня, но там все просто, уже баловался с ним

время реакции пока поставил 500мс, дальше видно будет в процессе использования

еще раз всем спасибо.

в конце скрин монитора порта

int val = 0; // создаем переменную регулировки и определяем её значение
boolean button = false; // нажатие кнопки (пульта или клацалки)
boolean flag = false; // сработка кнопки
unsigned long timer = 0; // таймер с момента включения
unsigned long timerPress = 0; // таймер удержания кнопки
int gatePin = 3; // указываем пин который будем управлять затвором
int buttonPin = 5; // указываем пин кнопки
int regim = 0; // режим
boolean trend = true; //направление переключения режимов в большую или меньшую сторону
boolean fix = false; // долговременние нажатие кнопки

void setup() {
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  timer = millis();
  button = digitalRead(buttonPin);
  // нажатие кнопки
  if (button == true && flag == false) //если кнопка нажата и флаг опущен...
  {
    flag = true; //поднимаем флаг
    timerPress = timer; // и таймеру нажатия присваивается значение таймера
  }
  //держание кнопки
  if (button == true && trend == true && flag == true && timer > (timerPress + 500) ) // если кнопка нажата и переключение режимов вверх и флаг подняти общий таймер больше таймера нажатия на 500мс
  {
    regim  = regim + 1; // режим + 1
    timerPress = timer; // сравниваем таймеры
    fix = true; // выксируем долговременное нажатие
  }
  if (button == true && trend == false && flag == true && timer > (timerPress + 500) ) //  если кнопка нажата и переключение режимов вниз и флаг подняти общий таймер больше таймера нажатия на 500мс
  {
    regim  = regim - 1; // режим  - 1
    timerPress = timer; // сравниваем таймеры
    fix = true; // выксируем долговременное нажатие
  }
  regim = constrain(regim, 0, 10); // ограничиваем значение переменной "regim" 0-10
  //отпускание кнопки долговременное нажатие
  if (button == false && fix == true && flag == true && timer > (timerPress + 510) ) // если кнопка отжата долговременное нажатие было и режим 0 и таймер меньше таймера нажатия на 510 мс
  {
    flag = false; // опускаем флаг
    trend = !trend; //инвертируем направление переключения режимов
    fix = false; //сбрасываем факт долговременного нажатия
  }
  if (regim == 10) { // в десятом режиме
    trend = false;  //переключаем направление выборов режима вниз
  }
  if (regim == 1) { //в первом режиме
    trend = true; //переключаем направление выбора режима вверх
  }
  //отпускание кнопки кратковременное нажатие
  if (button == false && fix == false && trend == true && flag == true && timer < (timerPress + 500) ) // если кнопка отжата и режим 0 и таймер меньше таймера нажатия на 500 мс
  {
    flag = false; // опускаем флаг
    regim  = 10; // режим равен 255
    trend = !trend; //инвертируем направление переключения режимов
  }
  if (button == false && fix == false && trend == false && flag == true && timer < (timerPress + 500) ) // если кнопка отжата и режим 10 и таймер меньше таймера нажатия на 500 мс
  {
    flag = false; // опускаем флаг
    regim  = 0; // режим равен 0
    trend = !trend; //инвертируем направление переключения режимов
  }
  // режимы
  if (regim == 0) {
    val = 0;
  }
  if (regim == 1) {
    val = 180;
  }
  if (regim == 2) {
    val = 180;
  }
  if (regim == 3) {
    val = 190;
  }
  if (regim == 4) {
    val = 200;
  }
  if (regim == 5) {
    val = 200;
  }
  if (regim == 6) {
    val = 210;
  }
  if (regim == 7) {
    val = 220;
  }
  if (regim == 8) {
    val = 230;
  }
  if (regim == 9) {
    val = 240;
  }
  if (regim == 10) {
    val = 255;
  }
  //вывод значения
  analogWrite(gatePin , val);
  //вывод в монитор
  Serial.print(" timer-");
  Serial.print (timer);
  Serial.print(" timerPress-");
  Serial.print (timerPress);
  Serial.print(" button-");
  Serial.print (button);
  Serial.print(" flag-");
  Serial.print (flag);
  Serial.print(" trend-");
  Serial.print (trend);
  Serial.print(" fix-");
  Serial.print (fix);
  Serial.print(" regim-");
  Serial.print (regim);
  Serial.print(" val-");
  Serial.println(val);
}

rizorpolder
Offline
Зарегистрирован: 05.07.2017

Доброго дня. Я только начал изучать программирование на Arduino, и столкнулся с такой проблемой - вопросом. Суть программы - 3 "секундомера", которые начинают свой отсчет по нажатию соответсвующей кнопки. Пока активен один - другие на паузе. Как это возможно реализовать, так как в моем коде появляется своеобразный "приоритет", тот секундомер который "выше" не дает переключаться на другие? Плата Mega 2560

Сразу говорю - это кусок кода всей программы. В программе есть кнопка переключения между программами при соблюдении условия. (OK.flagPress)

З.З.Ы. так же присутствует кнопка для вывода всех показаний сразу ( как результат).

Заранее благодарю, прошу сразу не бросаться в меня :)

#define GK_PIN 22 // Кнопка зеленых
#define RK_PIN 24 // кнопка красных
#define YK_PIN 26 // кнопка желтых
#define EK_PIN 29
#define OK_PIN 50
Button GK(GK_PIN, 20); // создание кнопки зеленых
Button RK(RK_PIN, 20); // создание кнопки красных
Button YK(YK_PIN, 20); // создание кнопки желтых
Button EK(EK_PIN, 20); // создание вывода результатов
Button OK(OK_PIN, 20);
int ledYellow = 27;
int ledRed = 25;
int ledGreen = 23;
unsigned long startR =0;
unsigned long startG=0;
unsigned long startY=0;
unsigned long x = 0;
unsigned long c = 0;
unsigned long z = 0;
unsigned long hourR;
unsigned long minuteR;
unsigned long secondR;
unsigned long hourG;
unsigned long minuteG;
unsigned long secondG;
unsigned long hourY;
unsigned long minuteY;
unsigned long secondY;
void setup(){
hourR = x / 3600;
  minuteR = (x - hourR * 3600) / 60;
  secondR = (x - minuteR * 60 - hourR * 3600);
  hourG = c / 3600;
  minuteG = (c - hourG * 3600) / 60;
  secondG = (c - minuteG * 60 - hourG * 3600);
  hourY = z / 3600;
  minuteY = (z - hourY * 3600) / 60;
  secondY = (z - minuteY * 60 - hourY * 3600);
 pinMode(25, OUTPUT);
  pinMode(23, OUTPUT);
  pinMode(27, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(GK_PIN,INPUT_PULLUP);
  pinMode(RK_PIN,INPUT_PULLUP);
  pinMode(YK_PIN,INPUT_PULLUP);
  pinMode(EK_PIN,INPUT_PULLUP);
}
void loop() {
  OK.scanState();
  GK.scanState();
  RK.scanState();
  YK.scanState();
  EK.scanState();

else if (OK.flagPress == false) {
  CheckScanStateEK();
  CheckScanStateRed();
  CheckScanStateGreen();
  CheckScanStateYellow();
// Дополнительные функции ----------------------------- Дополнительной программы --------------------------------
void CheckScanStateEK()
{
  if (EK.flagPress == true) {
    EK.flagPress = true;
    myOLED.clrScr();
    myOLED.print ("HTPEKMNFNS", CENTER, 0);
    myOLED.print("R", LEFT, 10);
    myOLED.print(timerR(), CENTER, 10);
    myOLED.print("P", LEFT, 20);
    myOLED.print(timerG(), CENTER, 20);
    myOLED.print(":", LEFT, 30);
    myOLED.print(timerY(), CENTER, 30);
    myOLED.update();
  }
}
void CheckScanStateRed()
{
  if (RK.flagClick == true) { // запуск при нажатии кнопки командой
      RK.flagClick = true; 
      GK.flagClick = false;
      YK.flagClick = false;
      inc_timerR();
    digitalWrite(ledRed, HIGH);
    digitalWrite(ledGreen, LOW);
    digitalWrite(ledYellow, LOW);
    myOLED.clrScr();
    myOLED.print("RHFCYST", CENTER, 0);
    myOLED.print("FRNBDBHJDFKB", CENTER, 20);
    myOLED.print("R", LEFT, 40);
    myOLED.print(timerR(), CENTER, 40);
    myOLED.update();
    
  }
}
void CheckScanStateGreen()
{
  if (GK.flagClick == true){
     GK.flagClick = true;
   RK.flagClick = false;
    YK.flagClick = false;
    inc_timerG();
    digitalWrite(ledRed, LOW);
    digitalWrite(ledGreen, HIGH);
    digitalWrite(ledYellow, LOW);
    myOLED.clrScr();
    myOLED.print("PTKTYST", CENTER, 0);
    myOLED.print("FRNBDBHJDFKB", CENTER, 20);
    myOLED.print("P", LEFT, 40);
    myOLED.print(timerG(), CENTER, 40);
    myOLED.update();
  }
}
void CheckScanStateYellow()
{
    if (YK.flagClick == true) {
    YK.flagClick = true;   
    RK.flagClick = false;
    GK.flagClick = false;  
    inc_timerY();
    digitalWrite(ledRed, LOW);
    digitalWrite(ledGreen, LOW);
    digitalWrite(ledYellow, HIGH);
    myOLED.clrScr();
    myOLED.print(":TKNST", CENTER, 0);
    myOLED.print("FRNBDBHJDFKB", CENTER, 20);
    myOLED.print(":", LEFT, 40);
    myOLED.print(timerY(), CENTER, 40);
    myOLED.update();
    
  }
}

void inc_timerR()
{ 
  Serial.println (startR);
  Serial.println(millis());
 if (startR<millis()) {
    x++;
    startR = millis() + 500;
    hourR = x / 3600;
    minuteR = (x - hourR * 3600) / 60;
    secondR = (x - minuteR * 60 - hourR * 3600);
    //time_controlR();
    Serial.println (startR);
  Serial.println(millis());
  
  }
}
void inc_timerG()
{
  Serial.println (startG);
  Serial.println(millis());
  if (startG<millis()) {
    c++;
    startG = millis() + 500;
    hourG = c / 3600;
    minuteG = (c - hourG * 3600) / 60;
    secondG = (c - minuteG * 60 - hourG * 3600);
    //time_controlG();
  }
}
void inc_timerY()
{
  Serial.println (startY);
  Serial.println(millis());
  if (startY<millis()) {
    z++;
    startY = millis() + 500;
    hourY = z / 3600;
    minuteY = (z - hourY * 3600) / 60;
    secondY = (z - minuteY * 60 - hourY * 3600);
    //time_controlY();

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

rizorpolder,ну и чем можно вам помочь. То что вы заехали не туда это ясно и вам. Но с моего взгляда вы поехали изначально не той дорогой. С мой точки зрения надо начинать составлять два типа класса - класс кнопка и класс секундомер. А потом все скомпоновать правильно. Бета тестировка и все.

rizorpolder
Offline
Зарегистрирован: 05.07.2017

Ды класс для кнопки создан, там подтянут через библиотеку. Код работает, все считает правильно,но есть одно НО - при нажатии на кнопку 3 - строка 59 все хорошо. При нажатии кнопки 2 - все работает, НО на кнопку 3 уже не перейти и так далее. Но если изменить клик кнопки с true-true на true-false, то кнопки работают, а таймер становится своего рода "кликером" ( 1 нажатие = +1 к переменной). Вот и вопрос - почему в первом варианте получается своеобразный "приоритет" программ. Или я загоняю программу в цикл, который не прерывается(строка 57)?

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

Так криво спроектирован таймер. Но вы проектировали таймер, так что все вопросы к пректировщику. У меня тоже программы не сразу запускаются. Даже как правило , запускаюся не с первого раза. Но ковыряться в чужом коде, если он написан не мной тяжко. А если я и начинаю, то код переписывается целиком или частями. А это значит, что тогда вы перестанете понимать переписаный код.

rizorpolder
Offline
Зарегистрирован: 05.07.2017

Понял. Спасибо. Будем копать в разных направлениях)

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

Вот пусть у вас есть класс Cl_timer, и Timer1,Timer2,Timer3 представители этого класса. Понятно что есть метод start(); - обнуляет таймер и начинает заново считать,метод stop()-отстанавливает счет , метод continue()- продолжает счет после стоп. ну и show() - показывает, что там натикало. Вот что бы считал один таймер надо Timer1.start() или(Timer1.continue()) ну а остальные Timer2.stop(),Timer3.stop()

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Винни, напиши статейку по классам для чайников. У меня тоже не лезет в мозг сама концепция, хотя видно что это круто удобно, но в инете нет внятных статей на русском, а твоих тезисов не хватает для понимания сути.

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

Tomasina пишет:
Винни, напиши статейку по классам для чайников. У меня тоже не лезет в мозг сама концепция, хотя видно что это круто удобно, но в инете нет внятных статей на русском, а твоих тезисов не хватает для понимания сути.

Так я порывался написать, но первое  каждый раз узнавал немного нового и приходится пересматривать. второе - я же не классы использую, а классы с  конструктором, setup() и loop() методами , третье есть же концепция многопоточной системы. Так там идет разделение потоков на низком уровне . Но это жрет много памяти. А вот разделение на потоки на высоком уровне оказалось проще. Четвертое - сам подход к проектированию программы. Ведь на самом деле я подход к проектированию не менял . Менялись инструменты.  Вот эти тезисы вроде явно понятны для меня, но почему-то туги для остальных. Ведь я же напрямую выкладываю исходники. И все равно не понятно.

Andrewsol
Offline
Зарегистрирован: 26.07.2017

Помогите пожалуйста. Нужно ,чтобы при нажатии 5 кнопок, загорелся один диод. Скетч загружается, но как надо не работает. Сильно не ругайте. Неделю назад взял ардуино в руки.

int Led = 11 ;

int buttonApin = 2;
int buttonBpin = 3;
int buttonCpin = 4;
int buttonDpin = 5;
int buttonEpin = 6;
 
void setup ()
{ pinMode (Led, OUTPUT) ; 
  pinMode (buttonApin ,INPUT);
  pinMode (buttonBpin ,INPUT);
  pinMode (buttonCpin ,INPUT);
  pinMode (buttonDpin ,INPUT);
  pinMode (buttonEpin ,INPUT);
}
 
 
void loop () 
 digitalRead (buttonApin);
 digitalRead (buttonBpin);
 digitalRead (buttonCpin);
 digitalRead (buttonDpin);
 digitalRead (buttonEpin);
 
if (2,3,4,5,6 == HIGH)  {
  digitalWrite (Led, HIGH);
  delay (2000) ;}
  else { digitalWrite (Led, LOW); } }
 

 

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

Andrewsol пишет:
Неделю назад взял ардуино в руки.
Но похоже голову забыли там,где взяли ардуину. То что код вставили неправильно. Новички на это забивают. Вот код.

digitalRead (buttonEpin);

замечательно. Состояние вы прочитали, но вот куда его поместить забыли. Или вы ходите в магазин, расплачиваетесь на кассе. И там на кассе оставляете товар. Нафиг руки надрывать. 

if (2,3,4,5,6 == HIGH) 

И вот вы пришли домой и сели смотреть футбол. Вам захотелось попить купленое пиво. Ну да пиво осталось на кассе. Так поэтому вы наслождаетесь "виртуальным пивом", которое лежит на кассе в кучке из 2, 3,4,5 и 6 товара.

ПС: Извините, за язвительнось, но новички попадаются такие "новички", что иначе им ум не возможно добавить. Видно школа не дорабатывает.

Andrewsol
Offline
Зарегистрирован: 26.07.2017

Ничего я толком,так и не понял.

что то типа того?:

if (buttonApin ==HIGH && buttonBpin == HIGH.....)

digitalWrite (Led, HIGH);

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

Andrewsol пишет:
Ничего я толком,так и не понял.
Вы, к сожалению, не поймете и это.

/*
*/
//----------------Компоновка------------------------------------------
const byte Led_pin = /*нога светодиода*/11 ;
const byte Btn1_pin =/*нога кнопки1*/ 2;
const byte Btn2_pin =/*нога кнопки2*/ 3;
const byte Btn3_pin =/*нога кнопки3*/ 4;
const byte Btn4_pin =/*нога кнопки4*/ 5;
const byte Btn5_pin =/*нога кнопки5*/ 6;
bool Btn1, Btn2, Btn3, Btn4, Btn5;// состояние на кнопках
//-------------main()----------------------------------------
void setup () {
  pinMode (Led_pin, OUTPUT) ;
  pinMode (Btn1_pin , INPUT);
  pinMode (Btn2_pin , INPUT);
  pinMode (Btn3_pin , INPUT);
  pinMode (Btn4_pin , INPUT);
  pinMode (Btn5_pin , INPUT);
}
void loop () {
  delay (500) ;
  Btn1 = digitalRead (Btn1_pin);
  Btn2 = digitalRead (Btn2_pin);
  Btn3 = digitalRead (Btn3_pin);
  Btn4 = digitalRead (Btn4_pin);
  Btn5 = digitalRead (Btn5_pin);

  if (Btn1 && Btn2 && Btn3 && Btn4 && Btn5)  {
    digitalWrite (Led_pin, HIGH);
  } else {
    digitalWrite (Led_pin, LOW);
  }
}
/*Скетч использует 1234 байт (3%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 14 байт (0%) динамической памяти, оставляя 2034 байт для локальных переменных. Максимум: 2048 байт.
*/

ПС: Выкиньте Ардуину. Это не ваше занятие.

Andrewsol
Offline
Зарегистрирован: 26.07.2017

Спасибо большое. Работает.

ПС: ну тоже не сразу начали писать мега скетчи:)

Andrewsol
Offline
Зарегистрирован: 26.07.2017

Нет времени изучать язык "Си" , а нужно уже вчера. Сейчас строю 3 квеста. Есть предложение: Вы пишете скетчи под конкретные задачи (их будет много), я перевожу вам деньги на карту. С железом я разберусь сам.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Andrewsol пишет:

ПС: ну тоже не сразу начали писать мега скетчи:)

Это не "мега скетчи", это основы программирования. Базовые кирпичики.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Andrewsol пишет:

Нет времени изучать язык "Си" , а нужно уже вчера. Сейчас строю 3 квеста. Есть предложение: Вы пишете скетчи под конкретные задачи (их будет много), я перевожу вам деньги на карту. С железом я разберусь сам.

Для этого есть специальный раздел - Ищу исполнителя.

Andrewsol
Offline
Зарегистрирован: 26.07.2017

ок, спасибо

 

GKV
Offline
Зарегистрирован: 01.10.2013

Уважаемый qwone.Подскажите,как изменить скетч,чтоб на вход подавать +5в,а не 0.Нужно чтоб вход управлялся +12в через делитель.R1=10kom на землю,R2=24kom.Спасибо.

// 8 times and 2 kontrol leds
//--------------------class Cl_Led------------------------
class Cl_Led {
    byte pin;
    bool led = 0;
  public:
    Cl_Led *pnt = NULL;
    Cl_Led(byte _pin): pin(_pin) {};
    uint32_t past = 0 ;
    uint32_t time = 0 ;
    setup() {
      if (this->pnt != NULL) this->pnt->setup();
      pinMode (pin, OUTPUT);
      digitalWrite(pin, LOW);
    };
    ON() {
      digitalWrite(pin, HIGH);
    };
    ON(uint32_t _time) {
      time = _time;
      past = millis();
      digitalWrite(pin, led = 1);
    };
    OFF() {
      digitalWrite(pin, led = 0);
    };
    loop() {
      if (this->pnt != NULL) this->pnt->loop();
      if (led && millis() - past >= time) {
        digitalWrite(pin, led = 0);
      }
    }
};
//----------------class Cl_Btn----------------------------
class Cl_Btn {
    byte pin ; // номер ноги на кнопке
    void (* Do1)(), (* Do2)();
    bool btn, btn_old;
    bool bounce_btn = 0; // антидребезговый флаг
    uint32_t past = 0 ;
  public:
    Cl_Btn *pnt = NULL;
    Cl_Btn(byte _pin, void (* _Do1)(), void (* _Do2)())
      : pin(_pin), Do1(_Do1), Do2(_Do2) {};
    void setup() {
      if (this->pnt != NULL) this->pnt->setup();
      pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой
      btn = digitalRead(pin); // прочитать реальное значение на выводе};
    }
    void loop() {
      if (this->pnt != NULL) this->pnt->loop();
      if (! bounce_btn && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
        bounce_btn = 1;                                 // выставить флаг
        past = millis();                         // сделать временую засветку
      }
      else if ( bounce_btn && millis() - past >= 5 ) { // если прошло антидребезговое время
        bounce_btn = 0;      // то снять флаг
        btn_old = btn ;
        btn = digitalRead(pin) ; // прочитать реальное значение на выводе
        if (btn_old && !btn)  Do1();
        if (!btn_old && btn)  Do2();
      }
    };
};
//-----------------class Cl_sys---------------------------
class Cl_sys {
    Cl_Led * StartLed = NULL;
    Cl_Btn * StartBtn = NULL;
  public:
    Cl_sys() {};
    void setup() {
      StartLed->setup();
      StartBtn->setup();
    };
    void loop() {
      StartLed->loop();
      StartBtn->loop();
    };
    void Plug(Cl_Led * Led) {
      Led->pnt = StartLed;
      StartLed = Led;
    };
    void Plug(Cl_Btn * Btn) {
      Btn->pnt = StartBtn;
      StartBtn = Btn;
    };
};
//--------------------------------------------
Cl_Led Led1(A0);
Cl_Led Led2(A1);
Cl_Led Led3(A2);
Cl_Led Led4(A3);
Cl_Led Led5(A4);
Cl_Led Led6(A5);
Cl_Led Led7(11);
Cl_Led Led8(12);
Cl_Led Led9(10);
Cl_Led Led10(13);

const uint32_t time1_50s = 50000 ;
const uint32_t time2_50s = 50000 ;
const uint32_t time3_50s = 50000 ;
const uint32_t time4_50s = 50000 ;
const uint32_t time5_30s = 30000 ;
const uint32_t time6_30s = 30000 ;
const uint32_t time7_30s = 30000 ;
const uint32_t time8_30s = 30000 ;
const uint32_t time9_2s = 2000 ;

void Do1_Btn1() {  // выполнить при нажатии кнопки Btn1
  Led1.ON();
  Led9.ON(time9_2s);
}
void Do2_Btn1() { //  выполнить при отжатии кнопки Btn1
  Led1.ON(time1_50s);
  Led9.ON(time9_2s);
}
void Do1_Btn2() {  // выполнить при нажатии кнопки Btn2
  Led2.ON();
  Led9.ON(time9_2s);
}
void Do2_Btn2() { //  выполнить при отжатии кнопки Btn2
  Led2.ON(time2_50s);
  Led9.ON(time9_2s);
}
void Do1_Btn3() {  // выполнить при нажатии кнопки Btn3
  Led3.ON();
  Led9.ON(time9_2s);
}
void Do2_Btn3() {  // выполнить при отжатии кнопки Btn3
  Led3.ON(time3_50s);
  Led9.ON(time9_2s);
}
void Do1_Btn4() {  // выполнить при нажатии кнопки Btn4
  Led4.ON();
  Led9.ON(time9_2s);
}
void Do2_Btn4() {  // выполнить при отжатии кнопки Btn4
  Led4.ON(time4_50s);
  Led9.ON(time9_2s);
}
void Do1_Btn5() {  // выполнить при нажатии кнопки Btn5
  Led5.ON();
  Led10.ON(time9_2s);
}
void Do2_Btn5() {  // выполнить при отжатии кнопки Btn5
  Led5.ON(time5_30s);
  Led10.ON(time9_2s);
}
void Do1_Btn6() {  // выполнить при нажатии кнопки Btn6
  Led6.ON();
  Led10.ON(time9_2s);
}
void Do2_Btn6() {  // выполнить при отжатии кнопки Btn6
  Led6.ON(time6_30s);
  Led10.ON(time9_2s);
}
void Do1_Btn7() {  // выполнить при нажатии кнопки Btn7
  Led7.ON();
  Led10.ON(time9_2s);
}
void Do2_Btn7() {  // выполнить при отжатии кнопки Btn7
  Led7.ON(time7_30s);
  Led10.ON(time9_2s);
}
void Do1_Btn8() {  // выполнить при нажатии кнопки Btn8
  Led8.ON();
  Led10.ON(time9_2s);
}
void Do2_Btn8() {  // выполнить при отжатии кнопки Btn8
  Led8.ON(time8_30s);
  Led10.ON(time9_2s);
}
Cl_Btn Btn1(2 , Do1_Btn1, Do2_Btn1);// подключить кнопку на выв 2
Cl_Btn Btn2(3 , Do1_Btn2, Do2_Btn2);// подключить кнопку на выв 3
Cl_Btn Btn3(4 , Do1_Btn3, Do2_Btn3);// подключить кнопку на выв 4
Cl_Btn Btn4(5 , Do1_Btn4, Do2_Btn4);// подключить кнопку на выв 5
Cl_Btn Btn5(6 , Do1_Btn5, Do2_Btn5);// подключить кнопку на выв 6
Cl_Btn Btn6(7 , Do1_Btn6, Do2_Btn6);// подключить кнопку на выв 7
Cl_Btn Btn7(8 , Do1_Btn7, Do2_Btn7);// подключить кнопку на выв 8
Cl_Btn Btn8(9 , Do1_Btn8, Do2_Btn8);// подключить кнопку на выв 9
Cl_sys Sys;

void setup() {
  Sys.Plug(&Led1);
  Sys.Plug(&Led2);
  Sys.Plug(&Led3);
  Sys.Plug(&Led4);
  Sys.Plug(&Led5);
  Sys.Plug(&Led6);
  Sys.Plug(&Led7); 
  Sys.Plug(&Led8);
  Sys.Plug(&Led9);
  Sys.Plug(&Led10);
  Sys.Plug(&Btn1);
  Sys.Plug(&Btn2);
  Sys.Plug(&Btn3);
  Sys.Plug(&Btn4);
  Sys.Plug(&Btn5);
  Sys.Plug(&Btn6);
  Sys.Plug(&Btn7);
  Sys.Plug(&Btn8);
  Sys.setup();
}
void loop() {
  Sys.loop();
}

 

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

GKV

Скорее всего будет так 

/*
*/
uint32_t mill;// переменая для millis()
//--------------------class Cl_Led------------------------
//класс светодиод
class Cl_Led {
    byte pin;
    bool led = 0;
  public:
    Cl_Led *pnt = NULL;
    Cl_Led(byte _pin): pin(_pin) {};
    uint32_t past = 0 ;
    uint32_t time = 0 ;
    setup() {
      if (this->pnt != NULL) this->pnt->setup();
      pinMode (pin, OUTPUT);
      digitalWrite(pin, LOW);
    };
    void ON() {
      digitalWrite(pin, HIGH);
    };
    void ON(uint32_t _time) {
      time = _time;
      past = mill;
      digitalWrite(pin, led = 1);
    };
    void OFF() {
      digitalWrite(pin, led = 0);
    };
    loop() {
      if (this->pnt != NULL) this->pnt->loop();
      if (led && millis() - past >= time) {
        digitalWrite(pin, led = 0);
      }
    }
};
//----------------class Cl_Btn----------------------------
//класс кнопка без программной подтяжки .
// кнопка нажата на ноге 1, отжата 0
class Cl_Btn {
    byte pin ; // номер ноги на кнопке
    void (* Do1)(), (* Do2)();
    bool btn, btn_old;
    bool bounce_btn = 0; // антидребезговый флаг
    uint32_t past = 0 ;
  public:
    Cl_Btn *pnt = NULL;
    Cl_Btn(byte _pin, void (* _Do1)(), void (* _Do2)())
      : pin(_pin), Do1(_Do1), Do2(_Do2) {};
    void setup() {
      if (this->pnt != NULL) this->pnt->setup();
      pinMode(pin, INPUT);// подключить кнопку
      btn = digitalRead(pin); // прочитать реальное значение на выводе};
    }
    void loop() {
      if (this->pnt != NULL) this->pnt->loop();
      if (! bounce_btn && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
        bounce_btn = 1;                                 // выставить флаг
        past = mill;                         // сделать временую засветку
      }
      else if ( bounce_btn && millis() - past >= 5 ) { // если прошло антидребезговое время
        bounce_btn = 0;      // то снять флаг
        btn_old = btn ;
        btn = digitalRead(pin) ; // прочитать реальное значение на выводе
        if (!btn_old && btn)  (* Do1)();
        if (btn_old && !btn)  (* Do2)();
      }
    };
};
//-----------------class Cl_sys---------------------------
class Cl_sys {
    Cl_Led * StartLed = NULL;
    Cl_Btn * StartBtn = NULL;
  public:
    Cl_sys() {};
    void setup() {
      StartLed->setup();
      StartBtn->setup();
    };
    void loop() {
      StartLed->loop();
      StartBtn->loop();
    };
    void Plug(Cl_Led * Led) {
      Led->pnt = StartLed;
      StartLed = Led;
    };
    void Plug(Cl_Btn * Btn) {
      Btn->pnt = StartBtn;
      StartBtn = Btn;
    };
};
//--------------------------------------------
Cl_Led Led1(A0);
Cl_Led Led2(A1);
Cl_Led Led3(A2);
Cl_Led Led4(A3);
Cl_Led Led5(A4);
Cl_Led Led6(A5);
Cl_Led Led7(11);
Cl_Led Led8(12);
Cl_Led Led9(10);
Cl_Led Led10(13);

const uint32_t time_50s = 50000 ;
const uint32_t time_30s = 30000 ;
const uint32_t time_2s = 2000 ;

void Do1_Btn1() {  // выполнить при нажатии кнопки Btn1
  Led1.ON();
  Led9.ON(time_2s);
}
void Do2_Btn1() { //  выполнить при отжатии кнопки Btn1
  Led1.ON(time_50s);
  Led9.ON(time_2s);
}
void Do1_Btn2() {  // выполнить при нажатии кнопки Btn2
  Led2.ON();
  Led9.ON(time_2s);
}
void Do2_Btn2() { //  выполнить при отжатии кнопки Btn2
  Led2.ON(time_50s);
  Led9.ON(time_2s);
}
void Do1_Btn3() {  // выполнить при нажатии кнопки Btn3
  Led3.ON();
  Led9.ON(time_2s);
}
void Do2_Btn3() {  // выполнить при отжатии кнопки Btn3
  Led3.ON(time_50s);
  Led9.ON(time_2s);
}
void Do1_Btn4() {  // выполнить при нажатии кнопки Btn4
  Led4.ON();
  Led9.ON(time_2s);
}
void Do2_Btn4() {  // выполнить при отжатии кнопки Btn4
  Led4.ON(time_50s);
  Led9.ON(time_2s);
}
void Do1_Btn5() {  // выполнить при нажатии кнопки Btn5
  Led5.ON();
  Led10.ON(time_2s);
}
void Do2_Btn5() {  // выполнить при отжатии кнопки Btn5
  Led5.ON(time_30s);
  Led10.ON(time_2s);
}
void Do1_Btn6() {  // выполнить при нажатии кнопки Btn6
  Led6.ON();
  Led10.ON(time_2s);
}
void Do2_Btn6() {  // выполнить при отжатии кнопки Btn6
  Led6.ON(time_30s);
  Led10.ON(time_2s);
}
void Do1_Btn7() {  // выполнить при нажатии кнопки Btn7
  Led7.ON();
  Led10.ON(time_2s);
}
void Do2_Btn7() {  // выполнить при отжатии кнопки Btn7
  Led7.ON(time_30s);
  Led10.ON(time_2s);
}
void Do1_Btn8() {  // выполнить при нажатии кнопки Btn8
  Led8.ON();
  Led10.ON(time_2s);
}
void Do2_Btn8() {  // выполнить при отжатии кнопки Btn8
  Led8.ON(time_30s);
  Led10.ON(time_2s);
}
Cl_Btn Btn1(2 , Do1_Btn1, Do2_Btn1);// подключить кнопку на выв 2
Cl_Btn Btn2(3 , Do1_Btn2, Do2_Btn2);// подключить кнопку на выв 3
Cl_Btn Btn3(4 , Do1_Btn3, Do2_Btn3);// подключить кнопку на выв 4
Cl_Btn Btn4(5 , Do1_Btn4, Do2_Btn4);// подключить кнопку на выв 5
Cl_Btn Btn5(6 , Do1_Btn5, Do2_Btn5);// подключить кнопку на выв 6
Cl_Btn Btn6(7 , Do1_Btn6, Do2_Btn6);// подключить кнопку на выв 7
Cl_Btn Btn7(8 , Do1_Btn7, Do2_Btn7);// подключить кнопку на выв 8
Cl_Btn Btn8(9 , Do1_Btn8, Do2_Btn8);// подключить кнопку на выв 9
Cl_sys Sys;

void setup() {
  Sys.Plug(&Led1);
  Sys.Plug(&Led2);
  Sys.Plug(&Led3);
  Sys.Plug(&Led4);
  Sys.Plug(&Led5);
  Sys.Plug(&Led6);
  Sys.Plug(&Led7);
  Sys.Plug(&Led8);
  Sys.Plug(&Led9);
  Sys.Plug(&Led10);
  Sys.Plug(&Btn1);
  Sys.Plug(&Btn2);
  Sys.Plug(&Btn3);
  Sys.Plug(&Btn4);
  Sys.Plug(&Btn5);
  Sys.Plug(&Btn6);
  Sys.Plug(&Btn7);
  Sys.Plug(&Btn8);
  Sys.setup();
}
void loop() {
  mill = millis();
  Sys.loop();
}
/*Скетч использует 2790 байт (8%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 249 байт (12%) динамической памяти, оставляя 1799 байт для локальных переменных. Максимум: 2048 байт.
*/

 

GKV
Offline
Зарегистрирован: 01.10.2013

Огромное Спасибо,пойду паять резисторы.

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

Вот если у вас там нет механических кнопок с дребезгом.

/*
*/
uint32_t mill;// переменая для millis()
//--------------------class Cl_Led------------------------
//класс светодиод
class Cl_Led {
    byte pin;
    bool led = 0;
  public:
    Cl_Led *pnt = NULL;
    Cl_Led(byte _pin): pin(_pin) {};
    uint32_t past = 0 ;
    uint32_t time = 0 ;
    setup() {
      if (this->pnt != NULL) this->pnt->setup();
      pinMode (pin, OUTPUT);
      digitalWrite(pin, LOW);
    };
    void ON() {
      digitalWrite(pin, HIGH);
    };
    void ON(uint32_t _time) {
      time = _time;
      past = mill;
      digitalWrite(pin, led = 1);
    };
    void OFF() {
      digitalWrite(pin, led = 0);
    };
    loop() {
      if (this->pnt != NULL) this->pnt->loop();
      if (led && millis() - past >= time) {
        digitalWrite(pin, led = 0);
      }
    }
};
//----------------class Cl_Btn----------------------------
//класс кнопка без программной подтяжки
// кнопка нажата на ноге 1, отжата 0
class Cl_Btn {
    byte pin ; // номер ноги на кнопке
    void (* Do1)(), (* Do2)();
    bool btn, btn_old;
  public:
    Cl_Btn *pnt = NULL;
    Cl_Btn(byte _pin, void (* _Do1)(), void (* _Do2)())
      : pin(_pin), Do1(_Do1), Do2(_Do2) {};
    void setup() {
      if (this->pnt != NULL) this->pnt->setup();
      pinMode(pin, INPUT);// подключить кнопку
      btn_old = digitalRead(pin); // прочитать реальное значение на выводе};
    }
    void loop() {
      if (this->pnt != NULL) this->pnt->loop();
      btn = digitalRead(pin) ; // прочитать реальное значение на выводе
      if (!btn_old && btn) { // если кнопка только что нажата
        btn_old = 1;
        (* Do1)();
      }
      if (btn_old && !btn) { // если кнопка только что отжата
        btn_old = 0;
        (* Do2)();
      }
    }
};
//-----------------class Cl_sys---------------------------
class Cl_sys {
    Cl_Led * StartLed = NULL;
    Cl_Btn * StartBtn = NULL;
  public:
    Cl_sys() {};
    void setup() {
      StartLed->setup();
      StartBtn->setup();
    };
    void loop() {
      StartLed->loop();
      StartBtn->loop();
    };
    void Plug(Cl_Led * Led) {
      Led->pnt = StartLed;
      StartLed = Led;
    };
    void Plug(Cl_Btn * Btn) {
      Btn->pnt = StartBtn;
      StartBtn = Btn;
    };
};
//-------------Компановка-------------------------------
Cl_Led Led1(/*пин*/A0);
Cl_Led Led2(/*пин*/A1);
Cl_Led Led3(/*пин*/A2);
Cl_Led Led4(/*пин*/A3);
Cl_Led Led5(/*пин*/A4);
Cl_Led Led6(/*пин*/A5);
Cl_Led Led7(/*пин*/11);
Cl_Led Led8(/*пин*/12);
Cl_Led Led9(/*пин*/10);
Cl_Led Led10(/*пин*/13);

const uint32_t time_50s = 50000 ;
const uint32_t time_30s = 30000 ;
const uint32_t time_2s = 2000 ;

void Do1_Btn1() {  // выполнить при нажатии кнопки Btn1
  Led1.ON();
  Led9.ON(time_2s);
}
void Do2_Btn1() { //  выполнить при отжатии кнопки Btn1
  Led1.ON(time_50s);
  Led9.ON(time_2s);
}
void Do1_Btn2() {  // выполнить при нажатии кнопки Btn2
  Led2.ON();
  Led9.ON(time_2s);
}
void Do2_Btn2() { //  выполнить при отжатии кнопки Btn2
  Led2.ON(time_50s);
  Led9.ON(time_2s);
}
void Do1_Btn3() {  // выполнить при нажатии кнопки Btn3
  Led3.ON();
  Led9.ON(time_2s);
}
void Do2_Btn3() {  // выполнить при отжатии кнопки Btn3
  Led3.ON(time_50s);
  Led9.ON(time_2s);
}
void Do1_Btn4() {  // выполнить при нажатии кнопки Btn4
  Led4.ON();
  Led9.ON(time_2s);
}
void Do2_Btn4() {  // выполнить при отжатии кнопки Btn4
  Led4.ON(time_50s);
  Led9.ON(time_2s);
}
void Do1_Btn5() {  // выполнить при нажатии кнопки Btn5
  Led5.ON();
  Led10.ON(time_2s);
}
void Do2_Btn5() {  // выполнить при отжатии кнопки Btn5
  Led5.ON(time_30s);
  Led10.ON(time_2s);
}
void Do1_Btn6() {  // выполнить при нажатии кнопки Btn6
  Led6.ON();
  Led10.ON(time_2s);
}
void Do2_Btn6() {  // выполнить при отжатии кнопки Btn6
  Led6.ON(time_30s);
  Led10.ON(time_2s);
}
void Do1_Btn7() {  // выполнить при нажатии кнопки Btn7
  Led7.ON();
  Led10.ON(time_2s);
}
void Do2_Btn7() {  // выполнить при отжатии кнопки Btn7
  Led7.ON(time_30s);
  Led10.ON(time_2s);
}
void Do1_Btn8() {  // выполнить при нажатии кнопки Btn8
  Led8.ON();
  Led10.ON(time_2s);
}
void Do2_Btn8() {  // выполнить при отжатии кнопки Btn8
  Led8.ON(time_30s);
  Led10.ON(time_2s);
}
Cl_Btn Btn1(/*пин*/2,/*обраб наж кноп*/Do1_Btn1,/*обраб отж кноп*/Do2_Btn1);// подключить кнопку на выв 2
Cl_Btn Btn2(/*пин*/3,/*обраб наж кноп*/Do1_Btn2,/*обраб отж кноп*/Do2_Btn2);// подключить кнопку на выв 3
Cl_Btn Btn3(/*пин*/4,/*обраб наж кноп*/Do1_Btn3,/*обраб отж кноп*/Do2_Btn3);// подключить кнопку на выв 4
Cl_Btn Btn4(/*пин*/5,/*обраб наж кноп*/Do1_Btn4,/*обраб отж кноп*/Do2_Btn4);// подключить кнопку на выв 5
Cl_Btn Btn5(/*пин*/6,/*обраб наж кноп*/Do1_Btn5,/*обраб отж кноп*/Do2_Btn5);// подключить кнопку на выв 6
Cl_Btn Btn6(/*пин*/7,/*обраб наж кноп*/Do1_Btn6,/*обраб отж кноп*/Do2_Btn6);// подключить кнопку на выв 7
Cl_Btn Btn7(/*пин*/8,/*обраб наж кноп*/Do1_Btn7,/*обраб отж кноп*/Do2_Btn7);// подключить кнопку на выв 8
Cl_Btn Btn8(/*пин*/9,/*обраб наж кноп*/Do1_Btn8,/*обраб отж кноп*/Do2_Btn8);// подключить кнопку на выв 9
Cl_sys Sys;
//---------main()--------------------------------------------------------------------
void setup() {
  Sys.Plug(&Led1);
  Sys.Plug(&Led2);
  Sys.Plug(&Led3);
  Sys.Plug(&Led4);
  Sys.Plug(&Led5);
  Sys.Plug(&Led6);
  Sys.Plug(&Led7);
  Sys.Plug(&Led8);
  Sys.Plug(&Led9);
  Sys.Plug(&Led10);
  Sys.Plug(&Btn1);
  Sys.Plug(&Btn2);
  Sys.Plug(&Btn3);
  Sys.Plug(&Btn4);
  Sys.Plug(&Btn5);
  Sys.Plug(&Btn6);
  Sys.Plug(&Btn7);
  Sys.Plug(&Btn8);
  Sys.setup();
}
void loop() {
  mill = millis();
  Sys.loop();
}
/*Скетч использует 2594 байт (8%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 209 байт (10%) динамической памяти, оставляя 1839 байт для локальных переменных. Максимум: 2048 байт.
*/

 

GKV
Offline
Зарегистрирован: 01.10.2013

Кнопок нету.Есть сигналы в виде +12в от других контроллеров.Спасибо!

gonzales
Offline
Зарегистрирован: 13.07.2015

прошу сильно не пинать, понимаю, что вопрос ламерский)))

Есть двойной переключатель (каким нормальный люди свет включают). Хочу привязать его к ардуино. Схема в аттаче.



S1, S2 - кнопки с фиксацией, резисторы по науке, подтяжка на землю. 

Получаю следующую картину. Пока S1 разомкнут, переключаю S2 - все замечательно. Но стоит замкнуть S1 и переключать S2, отрабатывает как бог пошлет. Соответственно наоборот тоже самое, пока S2 разомкнут можно щелкать S1, все работает, стоит S2 замкнуть и абзац.

Что подскажете? Может использовать подтяжку к питанию? Видел схему с резистивным делителем напряжения, конечно вариант, но хотелось бы понять, почему такой вариант не работает.

Заранее всем спасибо за ответы!

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

gonzales пишет:

прошу сильно не пинать, понимаю, что вопрос ламерский)))

ну, и где всё, кроме электрической схемы подключения кнопки?

- код?

- длина и тип кабеля? 

gonzales
Offline
Зарегистрирован: 13.07.2015

Вводные немного изменились))))

При стандатном методе обработки кнопок все работает. Вот код.

void CheckSwitch1() {

  State = digitalRead(Pin_D);

  if (sob > 0) {
    if (millis() - CurrentMillis > 100) {
      if (sob == 1 && State == HIGH && PreviosState != State) {
       PreviosState = State;
        //обработка нажатия
      }
      else if (sob == 2 && State == LOW && PreviosState != State) {
        PreviosState = State;
        //обработка нажатия
      }
      sob = 0;
    }

  }
  else {
    if (State == HIGH && PreviosState != State) {
      sob = 1;
      CurrentMillis = millis();
    }
    else if (State == LOW && PreviosState != State) {
      sob = 2;
      CurrentMillis = millis();
    }
  }
}
void loop(){
CheckSwitch1();
}

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

Вот код работы по прерыванию

#include "PinChangeInterrupt.h"
setup(){
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(Pin_D), CheckSwitch, CHANGE);
}

void CheckSwitch() {
  disablePinChangeInterrupt(digitalPinToPinChangeInterrupt(Pin_D));
  State = digitalRead(Pin_D);

  if (State == HIGH && PreviosState != State) {
    PreviosState = State;
    //обработка нажатия
  }
  else if (State == LOW && PreviosState != State) {
    PreviosState = State;
   //обработка нажатия
  }
  enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(Pin_D));
}

 

gonzales
Offline
Зарегистрирован: 13.07.2015

длина кабеля 10см. Тип - телефонный четырехжильный

gonzales
Offline
Зарегистрирован: 13.07.2015

Соответственно это код для одной кнопки. Для другой код такой же. 

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

gonzales пишет:

Соответственно это код для одной кнопки. Для другой код такой же. 

 У механических кнопок есть такое явление как дребезг, а вы их на прерывание.

gonzales
Offline
Зарегистрирован: 13.07.2015

Знаю я все про дребезг, сам писал в эту же тему про него. И в первом коде есть защита от него. В коде с прерываниями я отключаю прерывание, обрабатываю нажатие и включаю прерывание обратно. Дребезга никакого нет. Тут проблема именно в том, что кнопок ДВЕ!!! Пока она одна все работает, как только замыкаю вторую начинается хаос

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

gonzales пишет:

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

ок. а, какую цель ты преследуешь применяя прерывания для кнопки, которую нажимаешь рукой?

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

gonzales
Offline
Зарегистрирован: 13.07.2015

Убрать из loop обработку кнопок, убрать задержку 100мс на обработку дребезга. Проект высоконагруженный, в лупе крутится очень много всего, в частности обмен данными, любые задержки сказываются лагами. Хочется оптимизации))) Не круто тратить ресурсы на то, что не нажимается))) Причем с сенсорной кнопкой и звонковой кнопкой все отрабатывает. И даже в единичным переключателем все замечательно. Проблемы начинаются, когда их именно ДВА

gonzales
Offline
Зарегистрирован: 13.07.2015

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

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

gonzales пишет:

Убрать из loop обработку кнопок, убрать задержку 100мс на обработку дребезга. Проект высоконагруженный, в лупе крутится очень много всего, в частности обмен данными, любые задержки сказываются лагами.

что это за обработчик дребезга у тебя, который лагает прогрограмму на 100мс?

такого в принципе быть не должно.

gonzales пишет:

Не круто тратить ресурсы на то, что не нажимается)))

круто-некруто - при нажатии кнопки твои драгоценные ресурсы потратятся и ты так или иначе вылетишь в аварийную ситуацию.

если считаешь, что опрос кнопки тебе грозит катастрофой, то так и случится.

*не знаю - опрос матрицы из 100 кнопок  занимает 3750 микросекунд - 37,5 микросекунд на одну кнопку. это много? #479

Las42
Offline
Зарегистрирован: 25.05.2017

Прошу помощи, собираю планшет в машину для управления с руля использую ардуино микро тут возникла идея прикрутить к ней ещё и энкодер не могу понять как соеденить два скетча ! И как правильно их подключить вместе к ардуино, я в этом деле ночёвок и много го не понимаю, буду благодарен за помощь! 

gonzales
Offline
Зарегистрирован: 13.07.2015

Клапауций 112 пишет:

что это за обработчик дребезга у тебя, который лагает прогрограмму на 100мс?

такого в принципе быть не должно.

Код выше. Возможно можно сократить время до какого-то разумного значения.

Клапауций 112 пишет:

не знаю - опрос матрицы из 100 кнопок  занимает 3750 микросекунд - 37,5 микросекунд на одну кнопку. это много?

спасибо, библиотеку посмотрю!

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

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

gonzales пишет:

Код выше. Возможно можно сократить время до какого-то разумного значения.

ну, и в каком месте твоего кода у тебя должно лагать?

gonzales пишет:

Сам понимаешь, это все время. 

думаю, ты ты сам не до конца понимаешь, как это у тебя работает - время удержания кнопки во время её нажатия по любому будет больше времени опроса всех кнопок.

gonzales
Offline
Зарегистрирован: 13.07.2015

Клапауций 112 пишет:

думаю, ты ты сам не до конца понимаешь, как это у тебя работает - время удержания кнопки во время её нажатия по любому будет больше времени опроса всех кнопок.

я пытаюсь оптимизировать все настолько, насколько возможно. Раз прерывания не используются в системе, почему бы их не задействовать. И не нужно ничего опрашивать. В системе не только кнопки, еще различные датчики, которые тоже надо опрашивать, плюс обработка входящих команд и посылка ответов, все вместе немного подлагивает)))

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

ЗЫ. За библу еще раз спасибо, попробую ее прикрутить

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

gonzales пишет:

И не нужно ничего опрашивать. 

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

Las42
Offline
Зарегистрирован: 25.05.2017

Здравствуйте делаю планшет в машину! Остановился на подключении кнопок на руле точнее я подключил ардуйно про микро и кнопки но сейчас решил добавить энкодер и теперь не знаю как объединить два сетча помогите пожалуйста , сам не осилю! По отдельности все работает! Заранее спасибо

это для энкодера

#define BTN_pin  8             // pin 8 кнопка энкодера SW
const int pin_A = 10;          // pin 10 нога энкодера CLK
const int pin_B = 9;           // pin 9 нога энкодера DT
unsigned char encoder_A;        //переменная
unsigned char encoder_B;        //переменная
unsigned char encoder_A_prev=0; //переменная
uint32_t vibor = 0;             //Здесь будем хранть время
int perek = 0;                  //переменная переключатель
 
void setup()  {
  digitalWrite(BTN_pin, 1);     //подтяжка кнопки энкодера
  pinMode(pin_A, INPUT);        //пины энкодера объявляем входами
  pinMode(pin_B, INPUT);        //пины энкодера объявляем входами
  Keyboard.begin();             //подключим как клава  
               } 
 void loop()  
{
    
  { encoder_A = digitalRead(pin_A);          // считываем состояние выхода А энкодера 
    encoder_B = digitalRead(pin_B);          // считываем состояние выхода B энкодера    
    if((!encoder_A) && (encoder_A_prev)){    // если состояние изменилось с положительного к нулю
      if(encoder_B) 
           {
            Remote.increase(); //отправляем команду громкость выше
            Remote.clear();    //очищаем команду
            }
              else  {
                     Remote.decrease(); //отправляем команду громкость ниже
                     Remote.clear();    //очищаем команду              
                     }   
                                      } 
       encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла 
   } 
    if(digitalRead(BTN_pin)==LOW)      //Если кнопка нажата то делаем то что ниже.
         {
          Keyboard.press(KEY_LEFT_ALT);   //нажмем кнопку ALT
          Keyboard.press(KEY_TAB);        //нажмем кнопку TAB      
          Keyboard.release(KEY_TAB);      //отпустим кнопку TAB    
          delay(150);                     //ждем 150мс чтоб не скакало по окошкам
          vibor = millis();               //запускаем отсчет времени
          perek=1;                        //переменной переключателя присваиваем 1
     }
     if((vibor && millis()-vibor > 1000) && perek==1) //если прошло больше 1 секунды и перемменая переключателя = 1
       {
       Keyboard.releaseAll(); //отпускаем все кнопки
       perek = 0;             //переменной переключателя присваиваем 0 чтоб сюда больше не заходил
        }
   }
   

для кнопок на руль 

int rknop; // это переменная которая хранит  значения наших кнопок.
void setup()
{
Serial.begin(9600); //это скорость соединения с компьютером (для сериал монитора в нашем случае)
 
pinMode(rknop,INPUT); 
}
 
void loop()
{
rknop=analogRead(A0); //Считываем значения на порту A0 и записываем значения в переменную rknop
Serial.println(rknop); //Отправляем данные переменной rknop на компьютер
delay(200);  //небольшая задержка в пол секунды, её можно удалить но значения в сериал мониторе будет меняться очень быстро
 
///////////////////////////////////////////
if(rknop < 969 && rknop > 966) //здесь мы делаем условие. Т.е если у наз значение переменной rknop больше 900 и меньше 960 то делаем какоето действие которая ниже. На сколько мы помним при нажатии кнопки S1 у нас значения были ~930 так вот мы могли написать просто if(rknop == 930) что означает если rknop равно 930 то делем дейсвие которое ниже, но наши значения немного игрют поэтому мы задаем никий промежуток от 900 до 960
{
Remote.next(); //отправляем команду следующая песня
delay(200);      //делаем небольшую задержу чтоб устройство успело отправить необходимые команды на планшет или компьютер и не засыпать его командами
Remote.clear();//очищаем команду
}
 
////////////////////////////////////////////
if(rknop < 994 && rknop > 992)
{
Remote.previous(); //предыдущая песня
delay(200);
Remote.clear();
}
 
 ////////////////////////////////////////////
if(rknop < 927 && rknop > 925)
{
Remote.play_pause(); //плей и паузу
delay(200);
Remote.clear();
}

////////////////////////////////////////////
if(rknop < 1009 && rknop > 1007)
{
Remote.increase(); //громкость прибавить
delay(000);
Remote.clear();
}

////////////////////////////////////////////
if(rknop < 1019 && rknop > 1015)
{
Remote.decrease(); //громкость убавить
delay(000);
Remote.clear();
}

 

m0uz1337
Offline
Зарегистрирован: 13.08.2017

Добрый час. Прошу помощи пожалуйста не могу разобраться уже которую неделю. Проблема заключается в следующим. Купили DUE для АВР написали код на ручной запуск и автоматический, на ручном все работает. На автоматическом все коту под хвост. Дело в том что АВР в автономном режиме должна понимать что если света нет, то запустить генератор и работать до тех пор пока не включат свет на линии. Как только свет подают, то ардуина должна понять что свет дали и заглушить генератор. Все хорошо до того момента как свет появляется, ардуина не читает с пина что свет дали (( лине выключает генератор еще есть такая проблема что после включения генератора ардуино думает что это дали свет с главной линии и останавливает генератор, но эту проблему вроде решил. Ниже скину весь код в самом конце кода последняя проверка if (digitalRead(btn)==ON && one==0){ вот там вся проблема ардуино не понимает что свет включился на главном вводе (( хотя когда его отключаешь программа запуска генератора выполняется(( есть еще такой большой вариант то что это все DUE гонит она китайская((. Был бы благодарен если бы подсказали что может быть не так. есть еще несколько вариантов кода но суть не меняется((

Спасибо.

#define ON 0 // константа 0 
#define OFF 1 // константа 1 (в данной строке 1 преоброзовывается в 0, тем самым значения OFF на самой Ардуино становится низким) 
int one = 1; 
bool button_state = false; // переменная для хранения состояния кнопки 
int flag = 0; // значение для переменной 0 
int btn = 43; 

void setup() { 
Serial.begin(115200); 
Serial.println("Welcome"); 
// подтягивающий резистор на PIN'ы для реле 
digitalWrite(46, OFF); // Реле Свечи накала 
digitalWrite(45, OFF); // Реле АСС 
digitalWrite(44, OFF); // Реле Стартер 
//------------------------------------------// 
digitalWrite(43, OFF); // Реле Основной ввод (статус) 
digitalWrite(42, OFF); // Реле Питание от генератора(статус) 
digitalWrite(41, OFF); // Реле Подогрев 
//-----------------------------------------// 
digitalWrite(40, OFF); // Реле РЕЗЕРВ 
// digitalWrite(36, OFF); // Лед запуска генератора 
digitalWrite(37, OFF); // Реле РЕЗЕРВ 
digitalWrite(38, OFF); // Реле РЕЗЕРВ 
digitalWrite(39, OFF); // Реле РЕЗЕРВ 
// подтягивающий резистор на PIN'ы для LED 
digitalWrite(53, ON); // Синий LED Выполнение 
digitalWrite(52, ON); // Большой Синий LED Статус Автомтический режим АВР 
digitalWrite(51, ON); // Белый LED Статус Ручной режим АВР 
// Реле 
pinMode(46, OUTPUT); // Реле Свечи накала 
pinMode(45, OUTPUT); // Реле АСС 
pinMode(44, OUTPUT); // Реле Стартер 
pinMode(36, INPUT_PULLUP); // Лед запуска генератора 
pinMode(37, OUTPUT); // реле катушек ГЕНЕРАТОРА 
pinMode(38, OUTPUT); // реле катушек ОСНОВНОГО ВООДА 
pinMode(btn, INPUT); // Реле Основной ввод СТАТУС 
pinMode(42, OUTPUT); // Реле Питание от генератора СТАТУС 
pinMode(41, OUTPUT); // Реле Подогрев 
// Кнопки ВЛК/ВЫКЛ 
pinMode(50, INPUT_PULLUP); // Кнопка Запуска генератора 
pinMode(49, INPUT_PULLUP); // Кнопка Глушение генератора 
pinMode(48, INPUT_PULLUP); // Кнопка Ручной режим АВР 
pinMode(47, INPUT_PULLUP); // Кнопка Автоматический режим АВР 
// Светодиоды LED Статусы 
pinMode(53, OUTPUT); // Синий LED Выполнение 
pinMode(52, OUTPUT); // Большой Синий LED Статус Автомтический режим АВР 
pinMode(51, OUTPUT); // Белый LED Статус Ручной режим АВР 

} 

void loop() { 
// Кнопка Ручной режим АВР то делай ... 
if (digitalRead(48) == LOW){ 
  digitalWrite(51, LOW);/*отключаем белый диод*/ 
  digitalWrite(52, HIGH); /*включаем синий диод*/ 

// Запуск генератора с кнопки Старт 
if (digitalRead(50) == LOW && !button_state){ 
    button_state = true; 
      Serial.println("[-Mode manual start-]"); 
    digitalWrite(53, OFF); // Вкл Синий LED 
      delay(2000); // ждем 1 секунд 
      Serial.println(" -Start Svechi nakala"); 
    digitalWrite(46, ON); // зажигаем свечи накала 
      delay(15000); // ждем 15 секунд 
      Serial.println(" —---->power generator ON"); 
    digitalWrite(37, ON); // Отключаем ввод генератора 
      delay(100); 
    digitalWrite(38, ON); // Отключаем основной ввод 
      delay(2000); 
      Serial.println(" -Stop Svechi nakala"); 
    digitalWrite(46, OFF); // отключаем свечи накала 
      delay(1000); // ждем 1 секунд 
      Serial.println(" -Start ACC"); 
    digitalWrite(45, ON); // включаем АСС 
      delay(1500); // ждем 1 секунд 
      Serial.println(" -Start Starter"); 
    digitalWrite(44, ON); // Включаем стартер 
      delay(1500); // ждем 1.5 секунды 
      Serial.println(" -Stop Starter"); 
    digitalWrite(44, OFF); // Отключаем стартер 
      delay(120000); 
      Serial.println(" —---->power generator OFF"); 
    digitalWrite(37, OFF); // Включаем ввод генератора 
      delay(100); 
    digitalWrite(38, OFF); // Отключаем основной ввод 
      delay(1000); 
      Serial.println(" -Stop BLUE Led"); 
    digitalWrite(53, ON); // отключаем светодиод синий 
      delay(2000); // ждем 2 секунд 
      Serial.println("[-Mode manual on-]"); 
}
else { 
  // Статус кнопки FALSE 
  button_state = false; 
} 
// Глушение генератора с кнопки 
if (digitalRead(49) == LOW && !button_state) { 
  button_state = true; 
  digitalWrite(53, OFF); // Включаем светодиод синий 
    delay(1000); 
  digitalWrite(37, ON); // Отключаем ввод генератора 
    delay(100); 
  digitalWrite(38, ON); // Отключаем основной ввод 
    delay(1000); 
    Serial.println("[-StopACC-]"); 
  digitalWrite(45, OFF); // Отключаем АСС 
    delay(10000); 
  digitalWrite(37, OFF); //Включаем ввод генератора 
    delay(100); 
  digitalWrite(38, OFF); //Включаем основной ввод 
    delay(1000); 
    Serial.println(" -Stop BLUE Led"); 
  digitalWrite(53, ON); // отключаем светодиод синий 
} 
} 
// Если кнопка на автоматическом режиме то делай ... 
if (digitalRead(47) == LOW){ 
    digitalWrite(52, LOW);/*отключаем синий диод*/ 
    digitalWrite(51, HIGH); /*включаем белый диод*/ 
//*******LOGI*********// 
//Serial.println(digitalRead(36)); 
delay(1000); 
// Проверить есть ли свет ?? 
if (digitalRead(btn)==OFF && one==1){ 
    Serial.println("[-Mode automatic start-]"); 
  digitalWrite(53, OFF); // Вкл Синий LED 
    delay(2000); // ждем 1 секунд 
    Serial.println(" -Start Svechi nakala"); 
  digitalWrite(46, ON); // зажигаем свечи накала 
    delay(15000); // ждем 15 секунд 
    Serial.println(" —---->power generator ON"); 
  digitalWrite(37, ON); // Отключаем ввод генератора 
    delay(100); 
  digitalWrite(38, ON); // Отключаем основной ввод 
    delay(2000); 
    Serial.println(" -Stop Svechi nakala"); 
  digitalWrite(46, OFF); // отключаем свечи накала 
    delay(1000); // ждем 1 секунд 
    Serial.println(" -Start ACC"); 
  digitalWrite(45, ON); // включаем АСС 
    delay(1500); // ждем 1 секунд 
    Serial.println(" -Start Starter"); 
  digitalWrite(44, ON); // Включаем стартер 
    delay(1500); // ждем 1.5 секунды 
    Serial.println(" -Stop Starter"); 
  digitalWrite(44, OFF); // Отключаем стартер 
    delay(120000); 
    Serial.println(" —---->power generator OFF"); 
  digitalWrite(37, OFF); // Включаем ввод генератора 
    delay(100); 
  digitalWrite(38, OFF); // Отключаем основной ввод 
    delay(1000); 
    Serial.println(" -Stop BLUE Led"); 
  digitalWrite(53, ON); // отключаем светодиод синий 
    delay(9000); // ждем 2 секунд 
  one=0; 
// Света нету , есть свет от генератора 
} 

if (digitalRead(btn)==ON && one==0){ 
  digitalWrite(53, OFF); // Включаем светодиод синий 
    delay(1000); 
  digitalWrite(37, ON); // Отключаем ввод генератора 
    delay(100); 
  digitalWrite(38, ON); // Отключаем основной ввод 
    delay(1000); 
    Serial.println("[-Stop ACC-]"); 
  digitalWrite(45, OFF); // Отключаем АСС 
    delay(10000); 
  digitalWrite(37, OFF); //Включаем ввод генератора 
    delay(100); 
  digitalWrite(38, OFF); //Включаем основной ввод 
    delay(1000); 
    Serial.println(" -Stop BLUE Led"); 
  digitalWrite(53, ON); // отключаем светодиод синий 
  one=1; 
} 

} 

}

 

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

Главная проблема это delay(). Но millis() требует немного другого подхода. И этот подход Си++.

m0uz1337
Offline
Зарегистрирован: 13.08.2017

если использовать вместо delay то может пройдет7 просто уже как не пробовал6 самое что интересно что когда свет отключаеться ардуино понимает что пин 43 упал и надо завести енератор а когда свет дали 99 она не понимает хотя простой if =((

GKV
Offline
Зарегистрирован: 01.10.2013

Уважаемый qvone.Руки дошли до проверки таймера,оказалось ,что он не в том режиме работает.Нужно чтоб при появлении +5в на входе реле вкл "навсегда",а при исчезновении +5 в на входе -начинался отсчет(задержка отключения по управляющему входу)

uint32_t mill;// переменая для millis()
//--------------------class Cl_Led------------------------
//класс светодиод
class Cl_Led {
    byte pin;
    bool led = 0;
  public:
    Cl_Led *pnt = NULL;
    Cl_Led(byte _pin): pin(_pin) {};
    uint32_t past = 0 ;
    uint32_t time = 0 ;
    setup() {
      if (this->pnt != NULL) this->pnt->setup();
      pinMode (pin, OUTPUT);
      digitalWrite(pin, LOW);
    };
    void ON() {
      digitalWrite(pin, HIGH);
    };
    void ON(uint32_t _time) {
      time = _time;
      past = mill;
      digitalWrite(pin, led = 1);
    };
    void OFF() {
      digitalWrite(pin, led = 0);
    };
    loop() {
      if (this->pnt != NULL) this->pnt->loop();
      if (led && millis() - past >= time) {
        digitalWrite(pin, led = 0);
      }
    }
};
//----------------class Cl_Btn----------------------------
//класс кнопка без программной подтяжки
// кнопка нажата на ноге 1, отжата 0
class Cl_Btn {
    byte pin ; // номер ноги на кнопке
    void (* Do1)(), (* Do2)();
    bool btn, btn_old;
  public:
    Cl_Btn *pnt = NULL;
    Cl_Btn(byte _pin, void (* _Do1)(), void (* _Do2)())
      : pin(_pin), Do1(_Do1), Do2(_Do2) {};
    void setup() {
      if (this->pnt != NULL) this->pnt->setup();
      pinMode(pin, INPUT);// подключить кнопку
      btn_old = digitalRead(pin); // прочитать реальное значение на выводе};
    }
    void loop() {
      if (this->pnt != NULL) this->pnt->loop();
      btn = digitalRead(pin) ; // прочитать реальное значение на выводе
      if (!btn_old && btn) { // если кнопка только что нажата
        btn_old = 1;
        (* Do1)();
      }
      if (btn_old && !btn) { // если кнопка только что отжата
        btn_old = 0;
        (* Do2)();
      }
    }
};
//-----------------class Cl_sys---------------------------
class Cl_sys {
    Cl_Led * StartLed = NULL;
    Cl_Btn * StartBtn = NULL;
  public:
    Cl_sys() {};
    void setup() {
      StartLed->setup();
      StartBtn->setup();
    };
    void loop() {
      StartLed->loop();
      StartBtn->loop();
    };
    void Plug(Cl_Led * Led) {
      Led->pnt = StartLed;
      StartLed = Led;
    };
    void Plug(Cl_Btn * Btn) {
      Btn->pnt = StartBtn;
      StartBtn = Btn;
    };
};
//-------------Компановка-------------------------------
Cl_Led Led1(/*пин*/A0);
Cl_Led Led2(/*пин*/A1);
Cl_Led Led3(/*пин*/A2);
Cl_Led Led4(/*пин*/A3);
Cl_Led Led5(/*пин*/A4);
Cl_Led Led6(/*пин*/A5);
Cl_Led Led7(/*пин*/11);
Cl_Led Led8(/*пин*/12);
Cl_Led Led9(/*пин*/10);
Cl_Led Led10(/*пин*/13);

const uint32_t time_50s = 50000 ;
const uint32_t time_30s = 30000 ;
const uint32_t time_2s = 2000 ;
const uint32_t time_10s = 10000 ;
const uint32_t time_3s = 3000 ;
const uint32_t time_5s = 5000 ;

void Do1_Btn1() {  // выполнить при нажатии кнопки Btn1
  Led1.ON();
  Led9.ON(time_2s);
}
void Do2_Btn1() { //  выполнить при отжатии кнопки Btn1
  Led1.ON(time_30s);
  Led9.ON(time_2s);
}
void Do1_Btn2() {  // выполнить при нажатии кнопки Btn2
  Led2.ON();
  Led9.ON(time_2s);
}
void Do2_Btn2() { //  выполнить при отжатии кнопки Btn2
  Led2.ON(time_30s);
  Led9.ON(time_2s);
}
void Do1_Btn3() {  // выполнить при нажатии кнопки Btn3
  Led3.ON();
  Led9.ON(time_2s);
}
void Do2_Btn3() {  // выполнить при отжатии кнопки Btn3
  Led3.ON(time_30s);
  Led9.ON(time_2s);
}
void Do1_Btn4() {  // выполнить при нажатии кнопки Btn4
  Led4.ON();
  Led9.ON(time_2s);
}
void Do2_Btn4() {  // выполнить при отжатии кнопки Btn4
  Led4.ON(time_30s);
  Led9.ON(time_2s);
}
void Do1_Btn5() {  // выполнить при нажатии кнопки Btn5
  Led5.ON();
  Led10.ON(time_2s);
}
void Do2_Btn5() {  // выполнить при отжатии кнопки Btn5
  Led5.ON(time_30s);
  Led10.ON(time_2s);
}
void Do1_Btn6() {  // выполнить при нажатии кнопки Btn6
  Led6.ON();
  Led10.ON(time_2s);
}
void Do2_Btn6() {  // выполнить при отжатии кнопки Btn6
  Led6.ON(time_30s);
  Led10.ON(time_2s);
}
void Do1_Btn7() {  // выполнить при нажатии кнопки Btn7
  Led7.ON();
  Led10.ON(time_2s);
}
void Do2_Btn7() {  // выполнить при отжатии кнопки Btn7
  Led7.ON(time_30s);
  Led10.ON(time_2s);
}
void Do1_Btn8() {  // выполнить при нажатии кнопки Btn8
  Led8.ON();
  Led10.ON(time_2s);
}
void Do2_Btn8() {  // выполнить при отжатии кнопки Btn8
  Led8.ON(time_30s);
  Led10.ON(time_2s);
}
Cl_Btn Btn1(/*пин*/2,/*обраб наж кноп*/Do1_Btn1,/*обраб отж кноп*/Do2_Btn1);// подключить кнопку на выв 2
Cl_Btn Btn2(/*пин*/3,/*обраб наж кноп*/Do1_Btn2,/*обраб отж кноп*/Do2_Btn2);// подключить кнопку на выв 3
Cl_Btn Btn3(/*пин*/4,/*обраб наж кноп*/Do1_Btn3,/*обраб отж кноп*/Do2_Btn3);// подключить кнопку на выв 4
Cl_Btn Btn4(/*пин*/5,/*обраб наж кноп*/Do1_Btn4,/*обраб отж кноп*/Do2_Btn4);// подключить кнопку на выв 5
Cl_Btn Btn5(/*пин*/6,/*обраб наж кноп*/Do1_Btn5,/*обраб отж кноп*/Do2_Btn5);// подключить кнопку на выв 6
Cl_Btn Btn6(/*пин*/7,/*обраб наж кноп*/Do1_Btn6,/*обраб отж кноп*/Do2_Btn6);// подключить кнопку на выв 7
Cl_Btn Btn7(/*пин*/8,/*обраб наж кноп*/Do1_Btn7,/*обраб отж кноп*/Do2_Btn7);// подключить кнопку на выв 8
Cl_Btn Btn8(/*пин*/9,/*обраб наж кноп*/Do1_Btn8,/*обраб отж кноп*/Do2_Btn8);// подключить кнопку на выв 9
Cl_sys Sys;
//---------main()--------------------------------------------------------------------
void setup() {
  Sys.Plug(&Led1);
  Sys.Plug(&Led2);
  Sys.Plug(&Led3);
  Sys.Plug(&Led4);
  Sys.Plug(&Led5);
  Sys.Plug(&Led6);
  Sys.Plug(&Led7);
  Sys.Plug(&Led8);
  Sys.Plug(&Led9);
  Sys.Plug(&Led10);
  Sys.Plug(&Btn1);
  Sys.Plug(&Btn2);
  Sys.Plug(&Btn3);
  Sys.Plug(&Btn4);
  Sys.Plug(&Btn5);
  Sys.Plug(&Btn6);
  Sys.Plug(&Btn7);
  Sys.Plug(&Btn8);
  Sys.setup();
}
void loop() {
  mill = millis();
  Sys.loop();
}

Подскажите пожалуйста как переделать скетч,сам не сделаю.Спасибо.

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

GKV пишет:

Уважаемый qvone.Руки дошли до проверки таймера,оказалось ,что он не в том режиме работает.Нужно чтоб при появлении +5в на входе реле вкл "навсегда",а при исчезновении +5 в на входе -начинался отсчет(задержка отключения по управляющему входу)

А просто обменять местами обработчики нажатия и отжатия??

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

m0uz1337 пишет:

если использовать вместо delay то может пройдет7 просто уже как не пробовал6 самое что интересно что когда свет отключаеться ардуино понимает что пин 43 упал и надо завести енератор а когда свет дали 99 она не понимает хотя простой if =((

У вас завести генератор идет целая временная процедура, а не просто вкл реле. Отключить генератор тоже идет процедура. А что делать если свет пропал и снова появился а генератор еще не заведен. Или обратно свет включили на несколько минут а генератору что делать?

GKV
Offline
Зарегистрирован: 01.10.2013

Не получается,все равно при наличии +5в выход отключается через промежуток времени

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

GKV пишет:

Не получается,все равно при наличии +5в выход отключается через промежуток времени

Завтра подумаю. 

GKV
Offline
Зарегистрирован: 01.10.2013

Спасибо

konog
Offline
Зарегистрирован: 17.12.2015

Всем привет. Подскажите как реализовать:

При нажатии и удерживании кнопки более 2 секунд начинал работать генератор с частотой в 25 мс и отключалать при нажатии этой кнопки, а при нажатии второй кнопки и ее удерживании более 2 сек включалась защелка на другом выходе, но отключалась при кратковременном нажатии этой кнопки.

Реально голову себе сломал.