Вроде с таймерами разобрался, но никак не могу реализовать задуманное. Плиз, хелп!!!

ForestCrow
Offline
Зарегистрирован: 07.10.2017

Затея какая: от нажатия кнопки должен загореться один светодиод. По истечении 10 секунд первый светодиод должен погаснуть, а второй зажечься тоже на 10 секунд. При этом всем, нужно при нажатии второй кнопки весь этот процес прервать и вернуться в основную программу. Вот взял чужой скетч и на его основе пытаюсь реализовать. Второй LED либо совсем не зажигается, либо зажигается автоматически.

const int button1Pin = 5;
const int button2Pin = 3;
const int led1Pin = 13;
const int led2Pin =4 ;
unsigned long led1OnTime;
unsigned long led2OnTime;
//bool led1On;                             //Изначально было влючены везде эти переменные, но я их отключил и разницы в работе не увидел.
//bool led2On;

void setup() {                              /////////SETUP/////////
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
//led1On = false;
//led2On = false;
}
                                        
void loop(){                                 /////////LOOP/////////

if (digitalRead(button1Pin) == HIGH) {       //Кнопка1 нажата, лед включен, статус вкл, 
digitalWrite(led1Pin, HIGH);
//led1On = true;
led1OnTime = millis();
}

if (digitalRead(button2Pin) == HIGH) {       //Кнопка2 нажата, лед включен, статус вкл, 
digitalWrite(led2Pin, HIGH);
//led2On = true;
led2OnTime = millis();   
}

//if(led1On)
if(millis() - led1OnTime > 10000) {
digitalWrite(led1Pin, LOW);
//led1On = false;

}

//if(led2On)
if(millis() - led2OnTime > 10000) {   
digitalWrite(led2Pin, LOW);
//led2On = false;
}
}

 

 

T.Rook
Offline
Зарегистрирован: 05.03.2016

В чем сложность?

У Вас есть 4 события с действиями:

1. Надата кнопка1 (строка 21)

2. Нажата кнопка2 (27)

3. Закончилось время горения светодиода1 (34)

4.  Закончилось время горения светодиода2 (41)

И действия:

1. вкл. светодиод1 (22,24)

2. выкл светодиод1 (35)

3. вкл  светодиод2(28,30)

4. выкл светодиод2 (42)

Вам надо разложить действия по событиям.

 

ForestCrow
Offline
Зарегистрирован: 07.10.2017

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

P.S.

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Странно, как можно быть с компьютерами 15 лет и даже просто из любопытства не научиться банальным алгоритмам (

Может и не стоит начинать.

T.Rook
Offline
Зарегистрирован: 05.03.2016

Начинаем с начала :)

Опишите алгоритм работы в терминах из #1

Пример:

Событие98: выполняем действие №77, №88

Событие99: выполняем действие №....

 

ForestCrow
Offline
Зарегистрирован: 07.10.2017

Я попросил помощи, а не рассуждений как можно не научиться. Когда меня просят помочь настроить автоматический бэкап на облако я не начинаю строить из себя гуру и сверху в низ рассуждать как можно было этому не научиться, а либо даю конкретную статью, а не книгу по безопасности данных, либо лично пошагово направляю человека, в плоть до того, что удаленно подключаюсь и помогаю. Из за таких людей и не хочется сюда обращаться.  Лично я не слишком дофига видел программеров, которые хорошо разбираются в системном администрировании. Ничего, что это вообще разные направления? Я думаю andycat такой суперовый, что у него сразу же все начало получаться как только попробовал? Верно? Не было никаких загвоздок, все было понятно и элементарно? Сидишь на форуме, видешь просьбу о помощи либо помоги, либо пройди мимо. Ты совсем не знаешь собеседника, что бы рассуждать стоит ли начинать или нет. Может я меньше недели занимаюсь контроллерами и это единственная часть, которую мне осталось доделать до рабочей сигналке на RFID, датчиков растояния (не движения), GSM , на разрыв периметра, вибрационных датчиков на попытку взлома замка, т.к. от ёмкостного датчика пришлось отказаться из-за слишком больших помех. Так, что? Все еще не стоит начинать заниматься???

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

"письками меряться" :)

и кстати все гораздо проще: я системный администратор уже лет 20 , и всякие бэкапы в облако, и настройка Linux/Windows,

и чего я только не умею, и да, я не программист по образованию. Но начинал в 90х на Z80 и ВМ80

(дай бог памяти так назывался аналог Intel8080) на ассемблере и я с трудом представляю системного администратора,

который не знает как работают микропроцессоры и не может нарисовать алкоритм из двух кнопок :(

 

а все на самом деле просто:

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

b707
Offline
Зарегистрирован: 26.05.2017

ForestCrow пишет:

Лично я не слишком дофига видел программеров, которые хорошо разбираются в системном администрировании. Ничего, что это вообще разные направления?

все стало еще интереснее. Как можно быть сисадмином, не умея программировать? А как же системные скрипты? Пересборка софта? Правка исходников под свою систему, наконец? Или вы такой сисадмин, что только мышкой в винде дергаете? Тогда вы не сисадмин, а банальный эникей.

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

пользуйтесь на здоровье, решение "в лоб", наверняка можно оптимизировать, но лень.

ЗЫ. Хороший сис.админ должен уметь почти все :)

#define DOWNKEY 50 // minimal time msec down key + 50 msec
#define UPKEY 300 // minimal time beetween key press
#define KEY1 2
#define KEY2 3
#define LED1 7
#define LED2 8
#define LED3 9

boolean part1 = false;
unsigned long timePart1 = 0;
boolean part2 = false;
unsigned long timePart2 = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(KEY1, INPUT); digitalWrite(KEY1, HIGH);
  pinMode(KEY2, INPUT); digitalWrite(KEY2, HIGH);
  pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW);
  pinMode(LED1, OUTPUT); digitalWrite(LED1, LOW);
  pinMode(LED2, OUTPUT); digitalWrite(LED2, LOW);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (digitalRead(KEY2) == 0) {
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    part1 = false;
    part2 = false;
  }
  if (digitalRead(KEY1) == 0) {
    if (!part1) {
      part1 = true;
      digitalWrite(LED1, HIGH);
      timePart1 = millis();
    }
  }
  if (part1) {
    if ((millis() - timePart1) >= 10000) {
      part1 = false;
      digitalWrite(LED1, LOW);
      part2 = true;
      digitalWrite(LED2, HIGH);
      timePart2 = millis();
    }
  } else {
    if (part2) {
      if ((millis() - timePart2) >= 10000) {
        digitalWrite(LED1, LOW);
        digitalWrite(LED2, LOW);
        part1 = false;
        part2 = false;
      }
    }
  }
}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

кстати да, совсем забыл: со мной недавно работал такой "системный администратор", стаж работа лет 15 , а максимум он умел винду переставить и офис поставить - так что  бывают такие :)

 

GarryC
Offline
Зарегистрирован: 08.08.2016

А все таки, почему в Ардуино так не любят машины состояний ?

b707
Offline
Зарегистрирован: 26.05.2017

GarryC пишет:

А все таки, почему в Ардуино так не любят машины состояний ?

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

GarryC пишет:

А все таки, почему в Ардуино так не любят машины состояний ?

а можно расшифровать вопрос?

Почитал в Википедии ответ: я думаю все зависит от задачи, до 10ка уровней перехода можно и так запрограммировать.

 

GarryC
Offline
Зарегистрирован: 08.08.2016

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

Да и псевдо задачи на них делать легче.