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

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

ELITE пишет:

обновляй 25 раз в секунду - выше вообще бред....

почему 25-ть, а не 24?

откуда ты, вообще, знаешь, что у него происходит - я же запретил гадание на хрустальных шарах под страхом отлучения от Церкви Святаго Электричества и расстрела из катушки Тесла?

ELITE
Offline
Зарегистрирован: 11.01.2018

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

ELITE пишет:

обновляй 25 раз в секунду - выше вообще бред....

почему 25-ть, а не 24?

откуда ты, вообще, знаешь, что у него происходит - я же запретил гадание на хрустальных шарах под страхом отлучения от Церкви Святаго Электричества и расстрела из катушки Тесла?

в СССР было 25 - и это не спотолка взяли! - значит так оно правильно!

а 24 - это буржуйские

да и на деле выше 15 глаз уже почти не видит

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

ELITE пишет:

в СССР было 25 - и это не спотолка взяли! - значит так оно правильно!

ты - совкодрочер?

как же так вышло, что СССР с правильными 25 низвергнулся в АдЪ ?

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

ELITE пишет:

зачем тебе экран обновлять 1 раз за цикл?

обновляй 25 раз в секунду - выше вообще бред....

 

спасибо большое помогло обновлять один раз в 25 секунд, велосипед начал ехать=)))

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

Xumuk пишет:

ELITE пишет:

зачем тебе экран обновлять 1 раз за цикл?

обновляй 25 раз в секунду - выше вообще бред....

 

спасибо большое помогло обновлять один раз в 25 секунд, велосипед начал ехать=)))

Это шутка?
- ещё в обед же написано было что бессмысленно и вредно часто обновлять. Зачем 25 раз в секунду?

Обновлять вообще надо когда меняется информация на экране, тогда и не только велосипед поедет.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

andycat пишет:
Xumuk пишет:

ELITE пишет:

зачем тебе экран обновлять 1 раз за цикл?

обновляй 25 раз в секунду - выше вообще бред....

 

спасибо большое помогло обновлять один раз в 25 секунд, велосипед начал ехать=)))

Это шутка? - ещё в обед же написано было что бессмысленно и вредно часто обновлять. Зачем 25 раз в секунду? Обновлять вообще надо когда меняется информация на экране, тогда и не только велосипед поедет.

у меня он 1 раз за цикл лупа обновлялся

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

andycat пишет:
Зачем 25 раз в секунду?

Обновлять вообще надо когда меняется информация на экране, тогда и не только велосипед поедет.

а, если меняется чаще, чем 25 раз в секунду, то что делать?

*откуда вы все знаете, что ему нужно делать, если не видели его кода?

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

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

andycat пишет:
Зачем 25 раз в секунду?

Обновлять вообще надо когда меняется информация на экране, тогда и не только велосипед поедет.

а, если меняется чаще, чем 25 раз в секунду, то что делать?

*откуда вы все знаете, что ему нужно делать, если не видели его кода?

Согласен, был не прав, 

Но любопытно что там можно обновлять так часто

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

andycat пишет:

Но любопытно что там можно обновлять так часто

где "там"? отож. не знаем мы, что там подключено.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

ну рас так инетересно, то там все достаточно примитивно))) вольтметр=)))+прозвонка + генератор меандра 1гц

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

Xumuk пишет:

ну рас так инетересно, то там все достаточно примитивно))) вольтметр=)))+прозвонка + генератор меандра 1гц

п.с. забегая вперед отвечу сразу " делаев нету" все сделано на mils

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

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

bwn пишет:

Опять торпедируют, а ты нам нужен.

DetSimen пишет:

Да. Ты единственный среди нас, как сказали, кто очень добрый, чуткий и отзывчивый к новичкам.  Я аш всплакнул. Жалка будет, када тебя опять на 10 суток за хулиганство закроют. 

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

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

Andrew.vodny пишет:

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

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

Вот Вам для одной кнопки. Остальные я думаю сделаете по аналогии

#define BUTTON1_PIN 2
#define RELAY1_PIN 3
boolean blStatus1 = false;                     //логический флаг предыдущего состояния реле включено/выключено. По умолчанию при старте программы выключено
bool temp_kn1;

void setup() {
  // инициализируем подключения
  pinMode(BUTTON1_PIN, INPUT);                 //задаем пин 2 как вход кнопки
  pinMode(RELAY1_PIN, OUTPUT);                 //задаем пин 3 как выход на реле
}
void loop() {
  // основная программа. Разовое нажатие на кнопку будет включать или отключать реле без удержания кнопки
  if (digitalRead(BUTTON1_PIN) == HIGH && !temp_kn1) {   //проверяем, нажата ли кнопка (если на 2-м пине есть сигнал)
    temp_kn1 = 1;
    blStatus1 = !blStatus1;                 //меняем логический флаг на противоположный от установленного предыдущим нажатием
    digitalWrite(RELAY1_PIN, blStatus1);     //меняем состояние выхода соответственно логическому флагу
    delay (50);
  }
  else if (digitalRead(BUTTON1_PIN) == 0 && temp_kn1)temp_kn1 = 0;


  // Serial.println(blStatus);               //выводим состояние реле в серийный порт
}

 

Andrew.vodny
Andrew.vodny аватар
Offline
Зарегистрирован: 02.02.2018
#define BUTTON2_PIN 2
#define RELAY2_PIN 3
boolean blStatus2 = true;      //логический флаг предыдущего состояния реле включено/выключено. По умолчанию при старте программы выключено
void setup() {
  // инициализируем подключения
  pinMode(BUTTON2_PIN, INPUT);     //задаем пин 2 как вход кнопки
  pinMode(RELAY2_PIN, OUTPUT);     //задаем пин 3 как выход на реле
}
void loop() {
if (digitalRead(BUTTON2_PIN)==HIGH){  //если кнопка нажата 
 blStatus2 = !blStatus2;        // инвертируем значение
 digitalWrite(RELAY2_PIN, blStatus2); // пишем инвертированное значение в порт
 delay (5000);   
    }
}

 вот , дотрагиваюсь до кнопки реле включается , работает 5 сек и выключается , при этом сенсор приходитсья 0,2 сек подержать

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

А скопировать код с поста №1472 и проверить  НЕ!

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

Andrew.vodny пишет:
нажимаю на кнопку реле срабатывает , отжимаю реле выключается.а нужно при нажатие что бы включалось , при повторном нажатие выключалось
Ну если вам нужны "шашечки" то это .

/**/
unsigned long mill;// переменная для millis()
typedef void (*pDo)() ;// тип -функция обработчик
//------Cl_Led----------------------
// класс светодиод
class Cl_Led {
  protected:
    const byte pin;
    byte state; //0 выкл/ 1 вкл
    /*установить в состояние*/
    void stand(byte state_) {
      state = state_;
      switch (state) {
        case 0: // выкл
          digitalWrite(pin, LOW);
          break;
        case 1: // вкл
          digitalWrite(pin, HIGH);
          break;
      }
    }
  public:
    /*конструктор*/
    Cl_Led(byte pin_): pin(pin_) {}
    /*инициализация-вставить в setup()*/
    void init() {
      pinMode(pin, OUTPUT);
      OFF();
    }
    /*работа-вставить в loop()*/
    void run() {
    }
    /*включить*/
    void ON() {
      stand(1);
    }
    /*выключить*/
    void OFF() {
      stand(0);
    }
    /*переключить*/
    void invert() {
      if (state) stand(0);
      else stand(1);
    }
};
//------Cl_Btn----------------------
// класс кнопка
class Cl_Btn {
  protected:
    const byte pin;
    pDo Do;//обработчик
    bool bounce = 0;
    bool btn = 1, oldBtn;
    unsigned long past;
  public:
    /*конструктор*/
    Cl_Btn(byte pin_, pDo Do_): pin(pin_), Do(Do_) {}
    /*инициализация-вставить в setup()*/
    void init() {
      pinMode(pin, INPUT_PULLUP);
    }
    /*работа-вставить в loop()*/
    void run() {
      bool newBtn = digitalRead(pin);
      if (!bounce && newBtn != btn) {
        bounce = 1;
        past = mill;
      }
      if (bounce && mill - past >= 10) {
        bounce = 0 ;
        oldBtn = btn;
        btn = newBtn;
        if (!btn && oldBtn) Do();
      }
    }
};
//-----компоновка----------------------
Cl_Led Led1(/*пин*/13);
Cl_Led Led2(/*пин*/12);
Cl_Led Led3(/*пин*/11);
Cl_Led Led4(/*пин*/10);
void DoBtn1() {
  Led1.invert();
}
void DoBtn2() {
  Led2.invert();
}
void DoBtn3() {
  Led3.invert();
}
void DoBtn4() {
  Led4.invert();
}
Cl_Btn Btn1(/*пин*/2,/*обработчик*/DoBtn1);
Cl_Btn Btn2(/*пин*/3,/*обработчик*/DoBtn2);
Cl_Btn Btn3(/*пин*/4,/*обработчик*/DoBtn3);
Cl_Btn Btn4(/*пин*/5,/*обработчик*/DoBtn4);
//-----main----------------------
void setup() {
  Led1.init();
  Led2.init();
  Led3.init();
  Led4.init();
  Btn1.init();
  Btn2.init();
  Btn3.init();
  Btn4.init();
}
void loop() {
  mill = millis();
  Led1.run();
  Led2.run();
  Led3.run();
  Led4.run();
  Btn1.run();
  Btn2.run();
  Btn3.run();
  Btn4.run();
}

/*Скетч использует 1446 байт (4%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 61 байт (2%) динамической памяти, оставляя 1987 байт для локальных переменных. Максимум: 2048 байт.
*/

А если просто повисеть на форуме. То читайте форум.

bwn
Онлайн
Зарегистрирован: 25.08.2014

АХТУНГ, прошу всех подписанных и заинтересованных в теме принять участие в опросе и высказать свое мнение по предложениям. Неофитам, не улавливающим разницы между работой с кнопкой и включением реле, просьба не утруждаться.

GKV
Offline
Зарегистрирован: 01.10.2013
Нужно чтоб LED загорался при сигнале от счетчика и гас через 2 сек,на входе 2 остается постоянный уровень HIGH
#include <LiquidCrystal_I2C.h>                           //  Подключаем библиотеку для работы с LCD дисплеем по шине I2C
LiquidCrystal_I2C lcd(0x27,16,2);                        //  Объявляем  объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) Если дисплей не отвечает, то измените адрес на 0x3F


int buttonPin = 2;
int LED = 6;


int counterA=0;
int prevValueA=0;

int Perekis = 11;
byte valA; //переменная времени 
byte flagA;
long previousMillisA = 0;

int counterB=0;
int prevValueB=0;

int XLOR = 12;
byte valB; //переменная времени 
byte flagB;
long previousMillisB = 0;


void setup() {
  lcd.begin();
  pinMode(buttonPin, INPUT);
  pinMode(Perekis, OUTPUT);
  pinMode(XLOR, OUTPUT);
  pinMode(LED, OUTPUT);

  

}

void loop() {

boolean bs = digitalRead (buttonPin);

if(bs == HIGH && prevValueA==0) {
  prevValueA=1;
  counterA++;
}

if(bs == LOW) {
  prevValueA=0;
}
 lcd.setCursor(0, 0);
 lcd.print("PEREKIS::>"); 
 lcd.setCursor(12, 0);
 lcd.print("(8) ");
 lcd.setCursor(10, 0);
 lcd.print(counterA);
  
if (counterA<10)
{
  lcd.setCursor(11, 0);
  lcd.print(" "); 
}
if(counterA==8)
{
 counterA=0;
 previousMillisA = millis();
    flagA=1;
    valA=0;
  }
  if(flagA==1)
  {
    digitalWrite(Perekis,HIGH);
    
  }
  if(counterA<=8)
  {

    if (millis() -previousMillisA >1000)
    { 
      previousMillisA = millis();     
      valA++;                       // работает счет,ledPin1  включен 
    
    }  
  }
  if(valA>=2) //кол-во секунд ,при достижении этого значения , ledPin2 выключается
  { 
    digitalWrite(Perekis,LOW);
    flagA=0;
  }

if(bs == HIGH && prevValueB==0) {
  prevValueB=1;
  counterB++;
}

if(bs == LOW) {
  prevValueB=0;
}
 lcd.setCursor(0, 1);
 lcd.print(" XLOR  ::>"); 
 lcd.setCursor(12, 1);
 lcd.print("(10)");
 lcd.setCursor(10, 1);
 lcd.print(counterB);
  
if (counterB<10)
{
  lcd.setCursor(11, 1);
  lcd.print(" "); 
}
if(counterB==10)
{
 counterB=0;
 previousMillisB = millis();
    flagB=1;
    valB=0;
  }
  if(flagB==1)
  {
    digitalWrite(XLOR,HIGH);
    
  }
  if(counterB<=10)
  {

    if (millis() -previousMillisB >1000)
    { 
      previousMillisB = millis();     
      valB++;                       // работает счет,ledPin1  включен 
    
    }  
  }
  if(valB>=2) //кол-во секунд ,при достижении этого значения , ledPin2 выключается
  { 
    digitalWrite(XLOR,LOW);
    flagB=0;
  }  
  if (digitalRead(2) == HIGH) 
  {
  digitalWrite(LED, HIGH);
  }else{
  digitalWrite(LED, LOW);
  }
  
}

 

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

/**/
unsigned long mill;
//--------------------------------------
const byte btnPin =/*пин*/2;
bool btn;
const byte ledPin =/*пин*/3;
bool Led;
unsigned long past;
const unsigned long time2sec = 2000;
//-----------main()---------------------------
void setup() {
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, Led = 0);
}
void loop() {
  mill = millis();
  btn = digitalRead(btnPin);
  if (!btn) { /* если кнопка нажата*/
    digitalWrite(ledPin, Led = 1); /*то вкл светодиод*/
    past = mill;
  }
  if (Led & mill - past >= time2sec) {/*если светодиод горит больше 2 сек*/
    digitalWrite(ledPin, Led = 0);/*то выкл*/
  }
}
/*Скетч использует 1084 байт (3%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 19 байт (0%) динамической памяти, оставляя 2029 байт для локальных переменных. Максимум: 2048 байт.
*/

 

b707
Онлайн
Зарегистрирован: 26.05.2017

чуть поправлю код квона - и

/**/
unsigned long mill;
//--------------------------------------
const byte btnPin =/*пин*/2;
bool btn;
const byte ledPin =/*пин*/3;
bool Led;
unsigned long past;
const unsigned long time2sec = 2000;
//-----------main()---------------------------
void setup() {
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, Led = 0);
}
void loop() {
  mill = millis();
  btn = digitalRead(btnPin);
  if ((!btn)&&(past==0)) { /* если кнопка нажата*/
    digitalWrite(ledPin, Led = 1); /*то вкл светодиод*/
    past = mill;
  }
  if (Led & mill - past >= time2sec) {/*если светодиод горит больше 2 сек*/
    digitalWrite(ledPin, Led = 0);/*то выкл*/
  }
}

мигать не будет. По крайней мере 2 месяца :)

 

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

qwone спасибо за код,но чего-то не то.У меня с кнопки HIGH, подтяжка к GND 10K

#include <LiquidCrystal_I2C.h>             
LiquidCrystal_I2C lcd(0x27,16,2);                       

unsigned long mill;
const byte buttonPin = 2;

bool btn;
bool Led;
const byte ledPin = 6;
unsigned long past;
const unsigned long time2sec = 2000;

int counterA=0;
int prevValueA=0;

int Perekis = 11;
byte valA; //переменная времени 
byte flagA;
long previousMillisA = 0;

int counterB=0;
int prevValueB=0;

int XLOR = 12;
byte valB; //переменная времени 
byte flagB;
long previousMillisB = 0;


void setup() {
  lcd.begin();
  pinMode(buttonPin, INPUT);
  pinMode(Perekis, OUTPUT);
  pinMode(XLOR, OUTPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, Led = 0);
  

}

void loop() {

boolean bs = digitalRead (buttonPin);

if(bs == HIGH && prevValueA==0) {
  prevValueA=1;
  counterA++;
}

if(bs == LOW) {
  prevValueA=0;
}
 lcd.setCursor(0, 0);
 lcd.print("PEREKIS::>"); 
 lcd.setCursor(12, 0);
 lcd.print("(8) ");
 lcd.setCursor(10, 0);
 lcd.print(counterA);
  
if (counterA<10)
{
  lcd.setCursor(11, 0);
  lcd.print(" "); 
}
if(counterA==8)
{
 counterA=0;
 previousMillisA = millis();
    flagA=1;
    valA=0;
  }
  if(flagA==1)
  {
    digitalWrite(Perekis,HIGH);
    
  }
  if(counterA<=8)
  {

    if (millis() -previousMillisA >1000)
    { 
      previousMillisA = millis();     
      valA++;                       
    
    }  
  }
  if(valA>=2) 
  { 
    digitalWrite(Perekis,LOW);
    flagA=0;
  }

if(bs == HIGH && prevValueB==0) {
  prevValueB=1;
  counterB++;
}

if(bs == LOW) {
  prevValueB=0;
}
 lcd.setCursor(0, 1);
 lcd.print(" XLOR  ::>"); 
 lcd.setCursor(12, 1);
 lcd.print("(10)");
 lcd.setCursor(10, 1);
 lcd.print(counterB);
  
if (counterB<10)
{
  lcd.setCursor(11, 1);
  lcd.print(" "); 
}
if(counterB==10)
{
 counterB=0;
 previousMillisB = millis();
    flagB=1;
    valB=0;
  }
  if(flagB==1)
  {
    digitalWrite(XLOR,HIGH);
    
  }
  if(counterB<=10)
  {

    if (millis() -previousMillisB >1000)
    { 
      previousMillisB = millis();     
      valB++;                       
    
    }  
  }
  if(valB>=2) 
  { 
    digitalWrite(XLOR,LOW);
    flagB=0;
  }  
 
 mill = millis();
  btn = digitalRead(buttonPin);
  if (!btn) { /* если кнопка нажата*/
    digitalWrite(ledPin, Led = 1); /*то вкл светодиод*/
    past = mill;
  }
  if (Led & mill - past >= time2sec) {/*если светодиод горит больше 2 сек*/
    digitalWrite(ledPin, Led = 0);/*то выкл*/
  }          
   
  
}

 

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

b707 переделал к вы написали.Как переделать с подтяжкой к земле ,на кнопке +5в.Сейчас получается ,что ЛЕД загорается только при загрузке скетча

#include <LiquidCrystal_I2C.h>             
LiquidCrystal_I2C lcd(0x27,16,2);                       

unsigned long mill;
const byte buttonPin = 2;

bool btn;
bool Led;
const byte ledPin = 6;
unsigned long past;
const unsigned long time2sec = 2000;

int counterA=0;
int prevValueA=0;

int Perekis = 11;
byte valA; //переменная времени 
byte flagA;
long previousMillisA = 0;

int counterB=0;
int prevValueB=0;

int XLOR = 12;
byte valB; //переменная времени 
byte flagB;
long previousMillisB = 0;


void setup() {
  lcd.begin();
  pinMode(buttonPin, INPUT);
  pinMode(Perekis, OUTPUT);
  pinMode(XLOR, OUTPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, Led = 0);
  digitalWrite(buttonPin, LOW);

}

void loop() {

boolean bs = digitalRead (buttonPin);

if(bs == HIGH && prevValueA==0) {
  prevValueA=1;
  counterA++;
}

if(bs == LOW) {
  prevValueA=0;
}
 lcd.setCursor(0, 0);
 lcd.print("PEREKIS::>"); 
 lcd.setCursor(12, 0);
 lcd.print("(8) ");
 lcd.setCursor(10, 0);
 lcd.print(counterA);
  
if (counterA<10)
{
  lcd.setCursor(11, 0);
  lcd.print(" "); 
}
if(counterA==8)
{
 counterA=0;
 previousMillisA = millis();
    flagA=1;
    valA=0;
  }
  if(flagA==1)
  {
    digitalWrite(Perekis,HIGH);
    
  }
  if(counterA<=8)
  {

    if (millis() -previousMillisA >1000)
    { 
      previousMillisA = millis();     
      valA++;                       
    
    }  
  }
  if(valA>=2) 
  { 
    digitalWrite(Perekis,LOW);
    flagA=0;
  }

if(bs == HIGH && prevValueB==0) {
  prevValueB=1;
  counterB++;
}

if(bs == LOW) {
  prevValueB=0;
}
 lcd.setCursor(0, 1);
 lcd.print(" XLOR  ::>"); 
 lcd.setCursor(12, 1);
 lcd.print("(10)");
 lcd.setCursor(10, 1);
 lcd.print(counterB);
  
if (counterB<10)
{
  lcd.setCursor(11, 1);
  lcd.print(" "); 
}
if(counterB==10)
{
 counterB=0;
 previousMillisB = millis();
    flagB=1;
    valB=0;
  }
  if(flagB==1)
  {
    digitalWrite(XLOR,HIGH);
    
  }
  if(counterB<=10)
  {

    if (millis() -previousMillisB >1000)
    { 
      previousMillisB = millis();     
      valB++;                       
    
    }  
  }
  if(valB>=2) 
  { 
    digitalWrite(XLOR,LOW);
    flagB=0;
  }  
 mill = millis();
  btn = digitalRead(buttonPin);
  if ((!btn)&&(past==0)) { /* если кнопка нажата*/
    digitalWrite(ledPin, Led = 1); /*то вкл светодиод*/
    past = mill;
  }
  if (Led & mill - past >= time2sec) {/*если светодиод горит больше 2 сек*/
    digitalWrite(ledPin, Led = 0);/*то выкл*/
  }
   
  
}

 

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

Кнопка подключена к питанию. Светодиод горит еще 2 сек как кнопку отпустили

/**/
unsigned long mill;
//--------------------------------------
const byte btnPin =/*пин*/2;/*подтянуть к земле*/
bool btn;
const byte ledPin =/*пин*/3;
bool Led;
unsigned long past;
const unsigned long time2sec = 2000;
//-----------main()---------------------------
void setup() {
  pinMode(btnPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, Led = 0);
}
void loop() {
  mill = millis();
  btn = digitalRead(btnPin);
  if (btn) { /* если кнопка нажата*/
    digitalWrite(ledPin, Led = 1); /*то вкл светодиод*/
    past = mill;
  }
  if (Led & mill - past >= time2sec) {/*если светодиод горит больше 2 сек*/
    digitalWrite(ledPin, Led = 0);/*то выкл*/
  }
}
/*Скетч использует 1084 байт (3%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 19 байт (0%) динамической памяти, оставляя 2029 байт для локальных переменных. Максимум: 2048 байт.
*/

 

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

Дело в том,что кнопка на удержании,а ЛЕД должен загореться на 2 сек и погаснут при нажатой кнопке.

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

Не проверял работу

/**/
unsigned long mill;
typedef void (*pDo)();/* тип обработчик*/
//--------------------------------------
enum  {sLedOFF = 0, sLedON, sLedTimeON};
class Cl_Led {
  protected:
    byte pin;
    byte state;
    unsigned long past, time;
    void stand(byte s) {
      state = s;
      past = mill;
      switch (state) {
        case sLedOFF:
          digitalWrite(pin, LOW);
          break;
        case sLedON:
          digitalWrite(pin, HIGH);
          break;
        case sLedTimeON:
          digitalWrite(pin, HIGH);
          break;
      }
    }
  public:
    /*конструктор*/
    Cl_Led(byte p): pin(p) {}
    void init() {
      pinMode(pin, OUTPUT);
      stand(sLedOFF);
    }
    void run() {
      if (state == sLedTimeON && mill - past >= time) stand(sLedOFF);
    }
    void OFF() {
      stand(sLedOFF);
    }
    void ON() {
      stand(sLedON);
    }
    void ON(unsigned long t) {
      time = t;
      stand(sLedTimeON);
    }
};
//--------------------------------------
// класс кнопка подтянута к земле
class Cl_Btn {
  protected:
    byte pin;
    bool btn,  btnOld;
    pDo DoON, DoOFF;
  public:
    /*конструктор*/
    Cl_Btn(byte p, pDo D1, pDo D2)
      : pin(p), DoON(D1), DoOFF(D2) {
    }
    void init() {
      pinMode(pin, INPUT);
      btn = digitalRead(pin);
    }
    void run() {
      btnOld = btn;
      btn = digitalRead(pin);
      if (btn && !btnOld)  DoON();
      if (!btn && btnOld)  DoOFF();
    }
};
//-------компоновка--------------------------------------
Cl_Led Led(/*пин*/3);
const unsigned long time2sec = 2000;
void DoBtn1() {
  Led.ON(time2sec);/*вкл на 2 сек*/
}
void DoBtn2() {
  Led.OFF();
}
Cl_Btn Btn(/*пин*/2,/*обработчик вкл*/DoBtn1,/*обработчик выкл*/DoBtn2);
//-----------main()---------------------------
void setup() {
  Led.init();
  Btn.init();
}
void loop() {
  mill = millis();
  Led.run();
  Btn.run();
}
/*Скетч использует 1368 байт (4%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 30 байт (1%) динамической памяти, оставляя 2018 байт для локальных переменных. Максимум: 2048 байт.
*/

 

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

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

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

Из меня очень паршивый учитель-популизатор Так что изчайте как сможете http://arduino.ru/forum/programmirovanie/pomogite-novichku-ochen-prostoi-proekt-muchayus-3-dnya#comment-325365

Или моя тема http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov

 

bwn
Онлайн
Зарегистрирован: 25.08.2014

ВСЕМ НЕОФИТАМ, ЖАЖДУЩИМ ЗАДАТЬ ВОПРОС!
ДАННАЯ ТЕМА НЕ ПРЕДНАЗНАЧЕНА ДЛЯ ОБУЧЕНИЯ ВАС ОСНОВАМ ЯЗЫКА И ПРИЕМАМ СОВОКУПЛЕНИЯ ДВУХ И БОЛЕЕ СКЕТЧЕЙ. В ТЕМЕ РАССМАТРИВАЮТСЯ СПОСОБЫ ПОДКЛЮЧЕНИЯ КНОПОК, ПОДАВЛЕНИЕ ДРЕБЕЗГА, ФИКСАЦИЯ СОБЫТИЙ.
ВСЕ ВЫХОДЯЩЕЕ ЗА ОЗНАЧЕННЫЕ РАМКИ К РАБОТЕ С КНОПКАМИ НЕ ОТНОСИТСЯ И ОБСУЖДАЕТСЯ ВО ВНОВЬ СОЗДАННЫХ ИЛИ ПОДХОДЯЩИХ ТЕМАХ.
ОТВЕТЫ НА ОСНОВНЫЕ ВОПРОСЫ, ПО КНОПКАМ, МОЖНО НАЙТИ НА ПЕРВЫХ ПЯТИ СТРАНИЦАХ ТЕМЫ, УЧИТЕСЬ ЧИТАТЬ.

Можете так же ознакомится с "Сагой окнопках".
Для желающих "быстрого" результата "Титановый велосипед".

Если кто то желает добавить свои способы, варианты, описание библиотек, вэлком.

ЕЩЕ РАЗ ВОПРОШАЮЩИМ: ВСЕ БАНАЛЬНЫЕ ВОПРОСЫ УДАЛЯЮТСЯ БЕЗ ОБСУЖДЕНИЯ.

P/S если кто то считает, что его права нарушены, вэлком в пост.

P/P/S ЕЩЕ РАЗ, КТО ЖЕЛАЕТ ЗАЩИТИТЬ СВОИ ПРАВА И СВОБОДЫ, ССЫЛКА В ПОСТЕ. ТАМ КРОМЕ ХАМСТВА И ПОЛИТОТЫ НИЧЕГО НЕ УБИРАЮ.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

а почему не рассматривается вариант защиты на RS-тиггере? 1 корпус ла3 или тм2 - и 2 кнопки без дребезга. добавим типа ла2 и можем использовать вход преывания.

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет! Я сделал небольшое видео как решить проблему дребезга кнопок: https://www.youtube.com/watch?v=4KXKQCDh4X4