#26 2015-07-28 17:43:21

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Нужна помощь: Кнопка, тайминг, реле

запустите таймер например  с интервалом в 10 мс
если кнопка нажата  суммируйте время,отпустили - проверяйте время удержания
а дальше по времени удержания   и текущему состоянию.

Неактивний

#27 2015-07-28 20:09:51

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 874

Re: Нужна помощь: Кнопка, тайминг, реле

скачайте библиотеку OneButton.
там реализовано и длительное нажатие кнопки.

Неактивний

#28 2015-08-12 04:16:07

Mr.White
Учасник
З Хабаровск
Зареєстрований: 2015-08-12
Повідомлень: 2

Re: Нужна помощь: Кнопка, тайминг, реле

Всем привет. Вот такая проблема - не могу научить ардуино понимать числа с запятой. В общем. У меня есть кнопка. Она принимает два положения верхнее и нижнее. При опускании кнопки вниз  мониторинг порта говорит что аналоговый  пин №Х принимает 0.86 вольт, а в верхнем положении 1.72 . Нужно чтобы при этих вольтажа переключалось два реле. А именно 0.86 - горит только первое реле, 1.72 - горит только второе. Мне кажется что здесь нужен - map, но проблема в том что я не понимаю как это всё должно реализовываться. Помогите пожалуйста.

Неактивний

#29 2015-08-13 09:48:42

Mr.White
Учасник
З Хабаровск
Зареєстрований: 2015-08-12
Повідомлень: 2

Re: Нужна помощь: Кнопка, тайминг, реле

В общем я тут покумекал и пришёл к вот такому результату:

int analogInput = A0;
int regim=1;
int flag=0;
int value = 0;
float val = 0.0;
float voltage = 0.0;
float R1 = 20000.0;
float R2 = 470000.0;

void setup()   
{
Serial.begin(115200);
pinMode(13,INPUT_PULLUP);
pinMode(10,OUTPUT);   
pinMode(9,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(A0, INPUT);     
}

void loop()
{
value = analogRead(A0);
val = (value * 5) / 1023.0;
voltage = val / (R2/(R1+R2));
Serial.println(voltage);
delay(1);

if (voltage>4)
{digitalWrite(7,HIGH);
digitalWrite(8,HIGH);}

if (voltage<0.5)
{digitalWrite(7,HIGH);
digitalWrite(8,LOW);}

if (voltage>=1.0&& voltage<=1.5 )
{digitalWrite(7,LOW);
digitalWrite(8,HIGH);}

if (voltage>=1.90 && voltage<=1.98)
{if(digitalRead(13)==HIGH&&flag==0)
   {regim++;   
     flag=1;}         

     if(regim>4)
     {regim=1;}
   
     if(digitalRead(13)==LOW&&flag==1)
     {flag=0;}

     if(regim==2)
     {digitalWrite(10,HIGH);
     digitalWrite(9,LOW);}
     
     if(regim==4)
     {digitalWrite(9,HIGH);
     digitalWrite(10,LOW);}
}
}

Неактивний

#30 2015-08-13 10:29:10

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Нужна помощь: Кнопка, тайминг, реле

Mr.White цифру ловить используя ADC  - это идиологически неправильно ( т.е. кнопки, импульс c коленвала и т.д. )
все входные сигналы по возможности завязывайте на прерывания, а  в основном цикле (void loop() { __NOP(); } )  только   отложенная обработка

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


attachInterrupt(0, key_interrupt, RISING); 
mode задает режим обработки прерывания. Допустимо использование следующих констанст:
LOW вызывает прерывание, когда на порту LOW
CHANGE прерывание вызывается при смене значения на порту, с LOW на HIGH и наоборот
RISING прерывание вызывается только при смене значения на порту с LOW на HIGH
FALLING прерывание вызывается только при смене значения на порту с HIGH на LOW

http://arduino.ru/Reference/AttachInterrupt

Неактивний

#31 2015-11-19 18:08:08

Serg
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Ребят, подскажите пожалуйста какую функцию использовать в качестве таймера который работает сам по себе не задерживая цикл программы как delay. Цель, включать и отключать подсветку дисплея по событиям, не задерживая цикл программы. Заранее благодарен, не бейте ногами второй день с ардуино знакомлюсь..)))

#32 2015-11-19 20:38:42

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 874

Re: Нужна помощь: Кнопка, тайминг, реле

Неактивний

#33 2019-01-04 02:42:56

Vadim
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Ребята помогите з кодом.
Нужно чтоб при нажатии кнопки реле замкнулось на 2 сек. И после отпускания кнопки снова замкнулось на 2 секунды.

#34 2019-01-04 07:31:02

Selen
Учасник
Зареєстрований: 2017-01-02
Повідомлень: 88

Re: Нужна помощь: Кнопка, тайминг, реле

Vadim пише:

Ребята помогите з кодом.
Нужно чтоб при нажатии кнопки реле замкнулось на 2 сек. И после отпускания кнопки снова замкнулось на 2 секунды.

немного не понятно, вы кнопку удерживать более 2ух сек будете? А если коротко нажать?

Остання редакція Selen (2019-01-04 07:31:27)

Неактивний

#35 2019-01-04 09:01:28

Vadim
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Selen пише:
Vadim пише:

Ребята помогите з кодом.
Нужно чтоб при нажатии кнопки реле замкнулось на 2 сек. И после отпускания кнопки снова замкнулось на 2 секунды.

немного не понятно, вы кнопку удерживать более 2ух сек будете? А если коротко нажать?

Кнопка замкнута або розамкнута. Коротко не получица нажать.

#36 2019-01-06 18:47:07

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Нужна помощь: Кнопка, тайминг, реле

/**/
//#1
const byte ledPin = 13;
enum state1_t {sLedOFF, sLedON} state1;
unsigned long past1;
unsigned long time2s = 2000;
void stand1(state1_t s) {
  state1 = s;
  past1 = millis();
  switch (state1) {
    case sLedOFF:
      digitalWrite(ledPin, LOW);
      break;
    case sLedON:
      digitalWrite(ledPin, HIGH);
      break;
  }
}
//#2
const byte btnPin = 2;
enum state2_t {sBtnOFF, sBtnON} state2;
//---------main()-------------------------
void setup() {
  //#1
  pinMode(ledPin, OUTPUT);
  stand1(sLedOFF);
  //#2
  pinMode(btnPin, INPUT_PULLUP);
  state2 = sBtnOFF;
}
void loop() {
  //#1
  switch (state1) {
    case sLedOFF:
      break;
    case sLedON:
      if (millis() - past1 >= time2s) stand1(sLedOFF);
      break;
  }
  //#2
  bool tmp = digitalRead(btnPin);
  switch (state2) {
    case sBtnOFF:
      if (!tmp) {
        state2 = sBtnON;
        stand1(sLedON);
        delay(50);
      }
      break;
    case sBtnON:
      if (tmp) {
        state2 = sBtnOFF;
        stand1(sLedON);
        delay(50);
      }
      break;
  }
}

Неактивний

#37 2019-01-06 20:54:39

vadim
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

qwone пише:
/**/
//#1
const byte ledPin = 13;
enum state1_t {sLedOFF, sLedON} state1;
unsigned long past1;
unsigned long time2s = 2000;
void stand1(state1_t s) {
  state1 = s;
  past1 = millis();
  switch (state1) {
    case sLedOFF:
      digitalWrite(ledPin, LOW);
      break;
    case sLedON:
      digitalWrite(ledPin, HIGH);
      break;
  }
}
//#2
const byte btnPin = 2;
enum state2_t {sBtnOFF, sBtnON} state2;
//---------main()-------------------------
void setup() {
  //#1
  pinMode(ledPin, OUTPUT);
  stand1(sLedOFF);
  //#2
  pinMode(btnPin, INPUT_PULLUP);
  state2 = sBtnOFF;
}
void loop() {
  //#1
  switch (state1) {
    case sLedOFF:
      break;
    case sLedON:
      if (millis() - past1 >= time2s) stand1(sLedOFF);
      break;
  }
  //#2
  bool tmp = digitalRead(btnPin);
  switch (state2) {
    case sBtnOFF:
      if (!tmp) {
        state2 = sBtnON;
        stand1(sLedON);
        delay(50);
      }
      break;
    case sBtnON:
      if (tmp) {
        state2 = sBtnOFF;
        stand1(sLedON);
        delay(50);
      }
      break;
  }
}

Дякою

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму