Трудная задача. Светодиод и кнопки)

Suro
Offline
Зарегистрирован: 03.07.2017

Алгоритм:

1. Если кнопка 1 нажата - включить светодиод;
2. Если кнопка 1 нажата 10 секунд, и при этом кнопка 2 не нажата - выключить светодиод;
3. Если нажаты обе кнопки - включить светодиод, выключить его через 10 секунд после того, как кнопка 2 становится не нажатой.

Не могу дописать скетч.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Задача действительно трудная.

Ваша фраза 

Suro пишет:

Не могу дописать скетч.

Означает, что что-то Вы уже написали. В студию!

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

А что именно не можете дописать? Кроме сетапа и луп есть что-нибудь?

Suro
Offline
Зарегистрирован: 03.07.2017

Вот мой маленький и по моему неправильный код.

int switchPin1 = 9;
int switchPin2 = 10;
int ledPin = 11;
int interval;
void setup()
{
  pinMode(switchPin1, INPUT);
  pinMode(switchPin2, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop(){
  if (digitalRead(switchPin1) == HIGH){
    interval = millis();
    digitalWrite(ledPin,HIGH);
    if (interval - millis()<10000)
    digitalWrite(ledPin,LOW);
   
}

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

Suro
Offline
Зарегистрирован: 03.07.2017

наконец то написал алгоритм.

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



0 0 - отжаты: светодиод выключен, 10 сек таймер обнулен



1 0 - кнопка1 нажата: включить светодиод и запустить 10 сек таймер.



Если 1 0 состояние менее 10сек - светодиод горит и таймер запущен.

Если 1 0 состояние более 10сек - светодиод отключается и таймер обнуляется.



Если 1 0 состояние стало 1 1 до 10сек - светодиод оставается вкл и таймер обнуляется (горит столько сколько обе нажаты).

Если 1 0 состояние стало 1 1 после 10сек - светодиод включается а таймер оставается обнуленным.



1 1 - кнопка1 и кнопка2 нажаты: светодиод горит и таймер обнулен.



Если 1 1 состояние стало 1 0 - таймер включается и после 10сек светодиод выключается. 

Если 1 1 состояние стало 0 1 - светодиод отключается и таймер обнуляется.



0 1 - светодиод выключен, 10 сек таймер обнулен.



Если 0 1 состояние стало 0 0 - светодиод выключен, 10 сек таймер обнулен(тоест ничего не делать).

Если 0 1 состояние стало 1 1 - светодиод включается а таймер оставается обнуленным.

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

Проблема не в том что вы новичек, а в том что бы понять как решать такую задачу, надо много вам объяснять. Вот как объяснить первокласнику решение квадратного уровнения. Он ведь не только не знает математические операции, или всякие таблицы умножения и сложения, но и понятие что такое цифры. А вот расжевывать азы увольте меня . Я не репититор, и не за это не платят. Обратитесь  к платным исполнителям. Пусть у них голова болит.

Suro
Offline
Зарегистрирован: 03.07.2017

qwone если не хотите помогать не делайте этого чтобы голова ваша не сболела.

а мне не надо говорить что мне делать.

никто не радился все это зная.

Suro
Offline
Зарегистрирован: 03.07.2017

вот

int BUTTON1_PIN = 9;
int BUTTON2_PIN = 10;
int LED_PIN = 11;
unsigned long timer;


bool button1; //переменный состояний кнопок и леда
bool button2;
bool led;
  bool button1_on; //флаг нажатия кнопки 1
void setup(){
  pinMode(BUTTON1_PIN, INPUT);
  pinMode(BUTTON2_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {


button1 = digitalRead(BUTTON1_PIN); //считываются состояния кнопок и лампочки
button2 = digitalRead(BUTTON2_PIN);
led = digitalRead(LED_PIN);
   if(button1 && !button1_on) {  //если кнопка1 нажата, но флаг что она была нажата не стоит
     button1_on = 1; //ставим флаг что кнопка нажата
     delay(20);  //ждем 20мс чтоб дребезг ушел
     button1 = digitalRead(BUTTON1_PIN); //проверяем нажата ли кнопка все еще
     if(button1){  //если таки нажата
     timer = millis(); //засекаем текущее время, т.к. в изначальном условии есть флаг -
                           //оно засечется только в момент нажатия на кнопку
     if(!led){digitalWrite(LED_PIN,HIGH);} //если лампочка не горит, то зажигаем ее
     }}
   if(!button1 && button1_on) {button1_on=0;
digitalWrite(LED_PIN,LOW);} // если кнопка отжата - снимаем флаг нажатия кнопки
//и отключаем лампочку



   if(button2 && led){  //а тут тупо каждый цикл пока зажата кнопка 2 при горящем леде
     timer = millis();  //будет обновляться время в таймере
     }

   if(led && millis()-timer>10000){ // если лампочка горит и время не обновлялось более 10с
      digitalWrite(LED_PIN,LOW); //выключаем лампочку
      }

}

 

 

Suro
Offline
Зарегистрирован: 03.07.2017

?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Suro пишет:

?

так это мы у Вас справшиваем. Вот Вы привели код, и что? ЧТо именно в его работае Вас не устраивает, чем его работа отличается от того, что Вы хотите? Объясняйте!

Suro
Offline
Зарегистрирован: 03.07.2017

первая часть отлично работает - если кнопка1 нажата более 10сек светодиод выключается.

но надо что когда кноопка1 нажата более 10сек и светодиод выключен,при паралелном нажатии конпка2 включился светодиод.и после этого если отжали кнопка2 (но кнопка1 все же нажата) светодиод пусть выключится после 10сек

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Suro пишет:

надо что когда кноопка1 нажата более 10сек и светодиод выключен,при паралелном нажатии конпка2 включился светодиод.и после этого если отжали кнопка2 (но кнопка1 все же нажата) светодиод пусть выключится после 10сек

Вы хоть сам поняли, кто на ком стоял?

Давайте так, начиная вот с этого поста, я объяснял человеку как правильно описывать логику, чтобы она была однозначной и понятной, и как потом доводить эту логику до программы неким стндартизованным, всегда одинаковым способом. В результате, там за 10 постов проходится весь путь от идеи до готовой программы, которая появляется в посте №19.

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

Будут вопросы обращайтесь, только "вопросы" типа "не знаю как делать" вопросами не являются - это утверждение. Принимаются вопросы, конкретные и понятные.