Помогите написать скетч

TimurK
Offline
Зарегистрирован: 10.07.2016

Помогите пожалуйста написать скетч. Сам в этом не волоку. схему собрал, а вот с программированием засада.

Схема состоит из переключателя(сигнал 1), кнопки(сигнал 2) и трех светодиодов(1,2,3).

Опишу что нужно:

1. Имеется Сигнал 1(переключатель подает +5 В на цифровой вход) при этом горит светодиод 1 и светодиод 2. При пропадании Сигнала 1 должен погаснуть светодиод 1, а светодиод 3 должен загореться. Светодиод 2 не должен менять значения и продолжать гореть. через 5 секунд после зажигания Светодиода 3 все светодиоды должны погаснуть. Это я осилил. ниже код

int led1 = 4; // светодиод 1
int led2 = 5;// светодиод 2
int led3 = 6; //светодиод 3
int key1 = 2; // переключатель 
int key2 = 3;// кнопка
int val1 = 0;// переменная для хранения состояния переключателя
int val2 = 0;// переменная для хранения сигнала с кнопки

void setup() {
pinMode(led1, OUTPUT); 
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(key1, INPUT);
pinMode(key2, INPUT);  
}
void loop(){
   val1 = digitalRead(key1);
if (val1 == 1) { 
digitalWrite(led1, 1); 
digitalWrite(led2, 1);  
} else {
  digitalWrite(led1, 0);  
  digitalWrite(led3, 1);
  delay(5000);
  digitalWrite(led2, 0);
  digitalWrite(led3, 0);
  delay(5000);
} 
}

Далее интереснее, что я не смог организовать

2. Требуется  проверить условие, что если Сигнал 1 пропал менее чем на 5 секунд и появился в течении этого времени, то ничего не изменилось (Светодиод 1 и Светодиод 2 - светятся). Если же прошло 5 секунд то выполняется пункт 1.

3. Если сигнал 1 пропал и появился за пять секунд,но в течении 2 секунд после появления опять пропал, то гасет Светодиод 1, Светодиод 2. И ардуина ждет нажатие кнопки Сигнал 2. А при ее нажатии (Сигнал 2) зажигает Светодиод 2 и светодиод 3. По истечении 5 секунд снова все гасит.

 

Помогите реализовать 2 и 3 пункты. Совсем тяжело с ними.

И еще вопрос, как остановить выполнение в void loop()? Чтоб цикл выполнялся только один раз?

 

TimurK
Offline
Зарегистрирован: 10.07.2016

Задумал проект по реализации доводчиков стекол в автомобиле. СИГНАЛ 1 -это ключь зажигания, СИГНАЛ 2 - команда с пульта сигналки. Светодиоды имитируют - зажигание, подачу напряжения на блок стеклоподъемников, команда на закрытие соответственно.

 

SpectrumZX
Offline
Зарегистрирован: 10.07.2016

Тимур и К , опиши по-человечески алгоритм работы доводчика.Типа :"нажал кнопку "поднять" - то-то, включил ключ-  сделало другое.Я делаю то-же.Найдем решение вместе .

 И сразу по скетчу- тут на форуме ( и вообще ) не любят применение функции delay();.

TimurK
Offline
Зарегистрирован: 10.07.2016

Как то так себе это представляю:

1. Сел, включил зажигание(pin1=Hi), на блок стеклоподъемников пошло питание (pin4=Hi). Ничего не происходит, стекла управляются вручную.Катаюсь.

2. Остановился. Выключил зажигание (Pin1=low). Ардуина ждет 5 секунд и поднимает окна (pin3), т.е. идет питание на блок стеклоподъемников и сама команда(Pin4=Hi, Pin3=Hi).

3. Если с момнта первого отключения я в течении 5 секунд включил и опять выключил зажигание, то ардуина переходит в режим закрывания стекол от сигналки (pin2) (Если Pin2=Hi,то Pin3=Hi,Pin=4 Hi), и ожидает этот сигнал. Затем отключает питание с блока стеклоподъемников (Pin4=Low) (так планирую реализовать функцию отмены автоматического поднятия, например когда заглушил,но сижу в автомобиле). Если вдруг не поставил на охрану, а завел и поехал - то все снова к пункту 1.

4. если я во второй раз включил зажигание но не выключил в течении 2 секунд, то возврат к первому пункту.

 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

TimurK, почитайте про конечные автоматы.

Ну и blink without delay, естественно.

Цитата:
И еще вопрос, как остановить выполнение в void loop()? Чтоб цикл выполнялся только один раз?

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