2 Реле времени. Задержка включения и выключения.

leshak
Offline
Зарегистрирован: 29.09.2011

Leshiy пишет:

Я не то, что не поставил, я даже не читал.

Круто. Ну значит желаю и дальше бороться с переполнениями и проч. У меня-то проблем с понимаем этого всего нет. Так что от вашего "не чтения" я не пострадаю аж никак.
 

Leshiy пишет:

Лучше про структуры расскажите, про конкретное применение в данном случае. Я не понимаю их смысла здесь, на каждую кнопку по структуре объявлять, вы это имели ввиду?


А чего я буду рассказывать?  Это было ваше домашние задание. Пока я от вас никаких попыток (кода) по этому поводу не вижу. Вот увижу, тогда и буду думать "то я имел ввиду" или нет. Тем более что я однозначно говорил "массив структур", а не "массивы в структуре". И долго расписывал что именно из желания иметь один массив и возникла идея "заюзаем структуры".

А еще, напомню, кто-то через многомерный массив должен был решение подготовить. Что-бы сравнить его потом с решением через структуры.

Leshiy
Offline
Зарегистрирован: 19.07.2014

Вот оно мне надо.

monser
Offline
Зарегистрирован: 01.07.2017

4ERTIK пишет:

Примерно так (если я понял правильно)

//реле включения с задержкой и выключения с задержкой
#define ledPin1 12  //Реле 1 - управление
#define ledPin2 11  //Реле 2 - управление

byte valA; //переменная времени 
byte flagA;
long previousMillisA = 0;

byte valB; //переменная времени 
byte flagB;
long previousMillisB = 0; 


void setup()    
{ 

  pinMode(ledPin1, OUTPUT); //иниц выхода
  pinMode(ledPin2, OUTPUT); //иниц выхода

} 

void loop() 

{ 
  //**************************первый таймер , включаемый через Н-секунд после нажатия**********************************
  if(digitalRead(8)==HIGH)//если кнопка нажата ... 
  { 
    flagA=1;
  }
  if(flagA==1)
  {

    if (millis() -previousMillisA >1000) 
    { 
      previousMillisA = millis();     
      valA++;                       // работает счет,ledPin1  выключен 
      digitalWrite(ledPin1,LOW); 
    } 
  } 

  if(valA>=5) //кол-во секунд((millis() -previousMillisA >1000) при достижении этого значения , ledPin1 включается
  { 
    digitalWrite(ledPin1,HIGH);


  }
  if(digitalRead(8)==LOW)//если кнопка не нажата ... 
  { 
    flagA=0;
    digitalWrite(ledPin1,LOW); //выключаем ledPin1 
    valA=0;//обнуляем переменную
  } 

  //********************************таймер второй*********************
  if(digitalRead(9)==HIGH)//если кнопка нажата ... 
  { 
    previousMillisB = millis();
    flagB=1;
    valB=0;
  }
  if(flagB==1)
  {
    digitalWrite(ledPin2,HIGH);
  }
  if(flagB==1&&digitalRead(9)==LOW)
  {

    if (millis() -previousMillisB >1000)
    { 
      previousMillisB = millis();     
      valB++;                       // работает счет,ledPin1  включен 
      //      digitalWrite(ledPin2,LOW); 
    }  
  }
  if(valB>=10) //кол-во секунд ,при достижении этого значения , ledPin2 выключается
  { 
    digitalWrite(ledPin2,LOW);
    flagB=0;
  }


}


Спасибо, второй таймер именно то, что мне было нужно.
Но пока никак не могу справиться со второй частью  задачи:
Вроде проще некуда, но познания в программировании пока не позволяют справиться. Уже голову сломал.
 Имеются 2 входа и один выход.
 При включении устройства на обоих входах-1, выход-0.
 Через 2-3 сек на вх1 появляется-0 и если  вх2-1, на вых-1.
 Устройство в работе.
 При аварии, на вх2 появляется 0 в течении 2х сек.
 Вых должен стать -0 и блокироваться.
 Вот из за этих 2х сек никак и не могу справиться.

 

Ikossstas
Offline
Зарегистрирован: 19.12.2020

Дааааа почитал эту тему и офигел... Давно вынашиваю идею сделать реле времени с задержкой включения и задержкой выключения, с управлением по триггеру (постоянный +12в) да и сами реле мне нужны как раз на 12 вольт. Задача такая: сама ардуино находится в режиме ожидания, всегда на ней есть питание, допустим +12 вольт через Gnd и Vin. В какой то момент на ардуино приходит сигнал(триггер, +12В) (я знаю, что она работает на 5в, но как подружить 12в и 5в пока не знаю) после подачи сигнала идет отсчёт времени 2.5 минуты, после этого времени подаётся напряжение на замыкание реле 12в, реле замыкается. Реле остаётся замкнутым в течение того времени, пока на триггере есть +12в. Как только напряжение на триггере пропадает идет отсчёт ещё 2.5 минут и напряжение на реле пропадает, оно размыкается, все, ардуино снова ждет подачи напряжения на триггер. При этом если сигнал на триггер пришёл, отсчёт на замыкание реле пошел и сигнал с триггера пропал до того как реле замкнулось - ардуино должна прекратить считать и вернуться в режим ожидания сигнала на триггере.

Теперь вопросы, уважаемые знатоки, такое вообще реально сделать на ардуино и 12в реле? Как подружить между собой управление реле и самой ардуино, если у меня напряжения работы и управления разные? С чего вообще начать в этом деле?

rkit
Offline
Зарегистрирован: 23.11.2016

начинать с учебника по схемотенике

nik182
Offline
Зарегистрирован: 04.05.2015

Триггер это такая штука, которая срабатывает от фронта импульса. Сам импульс триггеру не нужен. Будет он стоять, не будет он стоять, триггер никак не будет реагировать на состояние тела импульса. В следующий раз триггер сработает от следующего такого же фронта. Поэтому называть триггерным механизмом описанную логику работы не правильно. Ваш алгоритм реализуется через автомат состояний. Почитать про это можно тут http://arduino.ru/forum/programmirovanie/novichkam-avtomatnoe-programmir...

Ikossstas
Offline
Зарегистрирован: 19.12.2020

Ну да, возможно с формулировкой триггера я ошибся, просто имел ввиду триггер как сигнал управления, условие для срабатывания

nik182
Offline
Зарегистрирован: 04.05.2015

Ну да, у них триггер это спусковой крючок. Как там у битлов
Happiness is a warm gun (bang, bang, shoot, shoot)
Happiness is a warm gun, momma (bang, bang, shoot, shoot)
When I hold you in my arms (ooh, oh, yeah)
And I feel my finger on your trigger (ooh, oh, yeah)
I know nobody can do me no harm (ooh, oh, yeah)...

Ikossstas
Offline
Зарегистрирован: 19.12.2020

Я так понимаю, нельзя просто подключить провод управления 12в на один из входов ардуино и читать от туда это напряжение?

nik182
Offline
Зарегистрирован: 04.05.2015

Можно через резистор 15к или через делитель 15к/5к. Второе надёжнее.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

nik182 пишет:
Можно через резистор 15к или через делитель 15к/5к. Второе надёжнее.

ТСу лучше обратится в платный раздел, там Скиф за 500 рублей и схему нарисует и код выдаст

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

Да уж. С такими вопросами - либо читать учебники, либо - в платный раздел.

Ikossstas
Offline
Зарегистрирован: 19.12.2020

Да, наверное самому с нуля не справиться, спасибо за направление к Скифу

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

Ikossstas пишет:
спасибо за направление к Скифу

Вы слишком доверчивы.

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

Ikossstas
Offline
Зарегистрирован: 19.12.2020

Может тогда лучше создать в разделе ищу исполнителя новую тему и договориться с тем, кто откликнется?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ikossstas пишет:
Может тогда лучше создать в разделе ищу исполнителя новую тему и договориться с тем, кто откликнется?

код тут простой, если сверхточность выдержки времени не требуется

Ikossstas
Offline
Зарегистрирован: 19.12.2020

[/quote]

сверхточность выдержки

[/quote]
Нет, совершенно не требуется, погрешность +-5 сек допустима

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ikossstas пишет:

 Нет, совершенно не требуется, погрешность +-5 сек допустима

а ардуина какая есть?

Ikossstas
Offline
Зарегистрирован: 19.12.2020

Нано на AtMega 328p

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ikossstas пишет:
Нано на AtMega 328p

блинк без делей залить смог? работает?

Green
Offline
Зарегистрирован: 01.10.2015
void loop() {
  timer_begin(rise);
  timer_begin(fall);
  if (rising(pin(INP)))                 //запустили передний таймер
    if (!pin(RELAY))                    // при выключенном реле
      timer_start(rise);
      
  if (falling(pin(INP))) {
    timer_stop(rise);                   //сбросили передний таймер
    if (pin(RELAY))
      timer_start(fall);                //запустили задний таймер при включенном реле
  }
  
  if (timer_finish(rise, 2500))         //проверяем таймеры
    on(RELAY);
  if (timer_finish(fall, 2500))
    off(RELAY);
}  

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

void loop() {
  timer_begin(rise);
  timer_begin(fall);
  if (rising(pin(INP)))                 //запустили передний таймер
    if (!pin(RELAY))                    // при выключенном реле
      timer_start(rise);
      
  if (falling(pin(INP))) {
    timer_stop(rise);                   //сбросили передний таймер
    if (pin(RELAY))
      timer_start(fall);                //запустили задний таймер при включенном реле
  }
  
  if (timer_finish(rise, 2500))         //проверяем таймеры
    on(RELAY);
  if (timer_finish(fall, 2500))
    off(RELAY);
}  

 

вот это ты напрасно сделал, а вдруг ТС с блинком не справился )))

Green
Offline
Зарегистрирован: 01.10.2015

Это как пример. Что бы логика была понятна.