Помогите с телом программы по стеклоподъемникам

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) (так планирую реализовать функцию отмены автоматического поднятия, например когда заглушил,но сижу в автомобиле)

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

начал писать сам но запутался с if и elso. да и не знаю как организовать чтение портов за определенное время (5 и 2 секунды) 

None
Offline
Зарегистрирован: 15.01.2016

Я так себе представляю:

Есть таймер, отсчитывающий секунды (отдельная переменная, даже две) на функции millis().

Ардуино должна быть запущена постоянно, т.е. питаться почти напрямую от АКБ, потому как она сама запускается около 3-5 сек.

На пин1 появился синал и переменная1 равна 0, то поднять напряжение на пин4, присвоить переменной значение 1.

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

Если нет, переменная 2 больше 0 и меньше 5, то:

"(Если Pin2=Hi,то Pin3=Hi,Pin=4 Hi), Затем отключает питание с блока стеклоподъемников (Pin4=Low)"

Если пин1 появился сигнал и переменная1 равна 1, то начать отсчет в переменную 3, если она достигла значения 2, то сбросить все переменные в 0.

ELSE использовать не обязательно.

Закинь, хоть какой-нибудь код, чтоб было от чего плясать.

 

 

TimurK
Offline
Зарегистрирован: 10.07.2016
Вот что у меня получилось. но как нужно не работает
 
int zazh = 4; // задаем номер выхода светодиода зажигания(внедрен для наглядности, по факту будет отсутствовать)
int blok = 5;// задаем номер выхода светодиода блока 
int stek = 6; //задаем номер выхода светодиода стекла
int key = 2; // задаем номер входа, подключенный к ключу зажигания 
int keysig=3;//задаем номер входа, подключенный к сигналке
int val1 = 0;// переменная для хранения состояния ключа зажигания
int val2 = 0;// переменная для хранения сигнала с сигнализации
int time1 = 0;// переменная времени 1 (5 секунд)
int time2 = 0;// переменная времени 2 (2 секунды)
unsigned long time;
void setup() {
pinMode(zazh, OUTPUT); 
pinMode(stek, OUTPUT);
pinMode(blok, OUTPUT);
pinMode(key, INPUT);
pinMode(keysig, INPUT);  
}
void loop(){
delay(5000);
  val1 = digitalRead(key); // считываем значения с входа ключа зажигания
if (val1 == HIGH) { // проверяем повернут ли ключ
digitalWrite(zazh, HIGH); // зажигаем индикацию зажигания
digitalWrite(blok, HIGH);  // подача питания на блок стеклоподъемников
} else {
  digitalWrite(zazh, LOW);  // гасим индикатор зажиганя
  time1=millis();// отсчитываем количество секунд
  if (time1>5);{// если прошло более 5 секунд
  digitalWrite(blok, HIGH);// подача питания на блок стеклоподъемников
  delay(3000);
  digitalWrite(stek, HIGH);// команда поднять стекла
  delay (5000);
  digitalWrite(stek, LOW);// снять команду поднять стекла
  delay (1000);
  digitalWrite(blok, LOW);// снять питание с блока стеклоподъемников
  delay(5000);
     if (val1 == HIGH){// проверяем повернут ли ключ
   digitalWrite(zazh, HIGH); // зажигаем индикацию зажигания
   digitalWrite(blok, HIGH); //  подача питания на блок стеклоподъемников
      time2=millis();}// отсчитываем количество секунд
    if (time2>2){
      digitalWrite(zazh, HIGH); // зажигаем индикацию зажигания
      digitalWrite(blok, HIGH);}//  подача питания на блок стеклоподъемников
    if (val2==HIGH){
      digitalWrite(blok, HIGH);// подача питания на блок стеклоподъемников
  delay(3000);
  digitalWrite(stek, HIGH);// команда поднять стекла
  delay (5000);
  digitalWrite(stek, LOW);// снять команду поднять стекла
  delay (1000);
  digitalWrite(blok, LOW);// снять питание с блока стеклоподъемников
      delay(5000);}
  }
}
}