Вроде с таймерами разобрался, но никак не могу реализовать задуманное. Плиз, хелп!!!
- Войдите на сайт для отправки комментариев
Ср, 11/10/2017 - 01:33
Затея какая: от нажатия кнопки должен загореться один светодиод. По истечении 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;
}
}
В чем сложность?
У Вас есть 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)
Вам надо разложить действия по событиям.
Я пробовал. Пробовал с булин переменными, но вторая лампа либо вообще не зажигается, либо зажигается сама в цикле, либо постоянно горит. Топо не хватает либо знаний, либо клепки, либо вообще подход ложный, либо все вместе. Сюда обращаюсь только в крайних случаях, после нескольких дней самостоятельных поисков решений когда уже опускаются руки, не люблю напрягать других людей и вообще кайфую когда получается у самого, но тут уже резерв терпения закончился. Сам терпеть не могу когда люди не включают мозг и хотят, что бы все за них сделали. По этому прошу более конкретной помощи со скетчем, либо действительно дельного совета куда копать. То за что этот скетч отвечает я прекрасно знаю, но не знаю как из него сделать то что нужно.
P.S.
Я не программер, я самоучка, что в компьютерной тематике, что в программировании ардуины. С компьютерами я больше 15 лет работаю и было у кого спросить, то в программировании даже посоветоваться, кроме форума не с кем. Хотя есть мысли пойти на курсы программирования и этим зарабатывать на жизнь, но это пока мысли, сейчас я битву с ардуиной проигрываю(.
Странно, как можно быть с компьютерами 15 лет и даже просто из любопытства не научиться банальным алгоритмам (
Может и не стоит начинать.
Начинаем с начала :)
Опишите алгоритм работы в терминах из #1
Пример:
Событие98: выполняем действие №77, №88
Событие99: выполняем действие №....
Я попросил помощи, а не рассуждений как можно не научиться. Когда меня просят помочь настроить автоматический бэкап на облако я не начинаю строить из себя гуру и сверху в низ рассуждать как можно было этому не научиться, а либо даю конкретную статью, а не книгу по безопасности данных, либо лично пошагово направляю человека, в плоть до того, что удаленно подключаюсь и помогаю. Из за таких людей и не хочется сюда обращаться. Лично я не слишком дофига видел программеров, которые хорошо разбираются в системном администрировании. Ничего, что это вообще разные направления? Я думаю andycat такой суперовый, что у него сразу же все начало получаться как только попробовал? Верно? Не было никаких загвоздок, все было понятно и элементарно? Сидишь на форуме, видешь просьбу о помощи либо помоги, либо пройди мимо. Ты совсем не знаешь собеседника, что бы рассуждать стоит ли начинать или нет. Может я меньше недели занимаюсь контроллерами и это единственная часть, которую мне осталось доделать до рабочей сигналке на RFID, датчиков растояния (не движения), GSM , на разрыв периметра, вибрационных датчиков на попытку взлома замка, т.к. от ёмкостного датчика пришлось отказаться из-за слишком больших помех. Так, что? Все еще не стоит начинать заниматься???
"письками меряться" :)
и кстати все гораздо проще: я системный администратор уже лет 20 , и всякие бэкапы в облако, и настройка Linux/Windows,
и чего я только не умею, и да, я не программист по образованию. Но начинал в 90х на Z80 и ВМ80
(дай бог памяти так назывался аналог Intel8080) на ассемблере и я с трудом представляю системного администратора,
который не знает как работают микропроцессоры и не может нарисовать алкоритм из двух кнопок :(
а все на самом деле просто:
"Вот взял чужой скетч" - это не правильно - сначала в голове (на бумаге) нарисуте алгоритм. - а реализовать его в коде элементарно.
Лично я не слишком дофига видел программеров, которые хорошо разбираются в системном администрировании. Ничего, что это вообще разные направления?
все стало еще интереснее. Как можно быть сисадмином, не умея программировать? А как же системные скрипты? Пересборка софта? Правка исходников под свою систему, наконец? Или вы такой сисадмин, что только мышкой в винде дергаете? Тогда вы не сисадмин, а банальный эникей.
Я 8 лет был сисадмином небольшой сетки с десятком серверов - программировать нужно было ежедневно. Считай именно на этой работе и научился, хотя профильного образования никогда не имел.
пользуйтесь на здоровье, решение "в лоб", наверняка можно оптимизировать, но лень.
ЗЫ. Хороший сис.админ должен уметь почти все :)
#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; } } } }кстати да, совсем забыл: со мной недавно работал такой "системный администратор", стаж работа лет 15 , а максимум он умел винду переставить и офис поставить - так что бывают такие :)
А все таки, почему в Ардуино так не любят машины состояний ?
А все таки, почему в Ардуино так не любят машины состояний ?
потому что область их применения слишком узкая. Новички ими не пользуются, потому что для них это слишком сложно, а для чуть более продвинутых проектов машины состояний уже получаются слишком громоздкими. Пример - вот сейчас делаю, в принципе, несложный проект весов с автоматической передачей показаний по GSM. Вроде и код небольшой. всего-то обработка событий от весов и от модема. А все равно уже пять вложенных друг в друга конечных автоматов...
А все таки, почему в Ардуино так не любят машины состояний ?
а можно расшифровать вопрос?
Почитал в Википедии ответ: я думаю все зависит от задачи, до 10ка уровней перехода можно и так запрограммировать.
Ну просто в данном случае автомат был бы как раз кстати.
Да и псевдо задачи на них делать легче.