#1 2016-10-19 13:49:45

iskander_famous
Учасник
Зареєстрований: 2016-04-13
Повідомлень: 8

Включение выключение нагрузки с отсрочкой

Добрый день.
Помогите пожалуйста решить задачу:
Есть входная дверь, над дверью висит тепловая завеса.
Нужно чтобы завеса включалась если дверь открыта более 15 сек и автоматически отключалась через 30 сек после закрытия двери.
Из того что в наличии:

Геркон
Плата реле
Ардуино уно
Прямые руки

Чего не хватает: мозгов и опыта для написания скетча.
Мигать светодиодами и показывать время я научился, а как прикрутить таймеры с отсчетом к сожаленью не соображу.

Неактивний

#2 2016-10-19 14:34:41

AlexPi
Учасник
Зареєстрований: 2016-10-06
Повідомлень: 4

Re: Включение выключение нагрузки с отсрочкой

В принципе задачка не сложная. Можно воспользоваться таймером описано тут http://arduino.ru/Tutorial/Arduino_Interrupts
А еще есть вот такая штука: FLProg  там программа практически рисуется из блоков.

Неактивний

#3 2016-10-19 14:40:31

iskander_famous
Учасник
Зареєстрований: 2016-04-13
Повідомлень: 8

Re: Включение выключение нагрузки с отсрочкой

Спасибо, попробую.

Неактивний

#4 2016-10-19 17:22:09

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: Включение выключение нагрузки с отсрочкой

Здеся нужно смотреть, что за тепловая завеса? Как часто проскальзывают через дверь?
Вдруг тепловую завесу нельзя часто включать.

Неактивний

#5 2016-10-19 17:47:11

iskander_famous
Учасник
Зареєстрований: 2016-04-13
Повідомлень: 8

Re: Включение выключение нагрузки с отсрочкой

Задача такова, что по утрам приезжают грузиться курьеры и дверь постоянно открыта, зимой это не сильно комильфо, а так завеса будет включаться автоматически только тогда когда дверь долго открыта. Это бывает не так часто, утром 2-4 раза, и в течении дня, если товар приезжает.
Я так понял мне нужно 2 таймера.
1й например timer_vkl запускается при открытии двери (геркон=0 разомкнут) и начинает отсчет. Дальше дуня смотрит, если значение таймера более 15сек, включается реле с нагрузкой.
Когда геркон=1 (замкнут) таймер останавливается, дуня смотрит на реле, если реле включено, запускается второй таймер (timer_otkl) при достижении 30 сек, реле отключается.
Как то так.
Осталось понять, как засунуть это в скетч

Остання редакція iskander_famous (2016-10-19 17:48:30)

Неактивний

#6 2016-10-19 18:29:53

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: Включение выключение нагрузки с отсрочкой

Отсчет таймера  millis(); Отсчет времени по срабатыванию геркона на открытие двери, и отсчет по срабатыванию геркона при закрытии двери.

Неактивний

#7 2016-10-19 22:41:22

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Включение выключение нагрузки с отсрочкой

Объяснять как работает код долго. Залейте и погоняйте его.

/*
#1 геркон           -> A2 (gercon_pin) 0 дверь открыта / 1 закрыта
   тепловая завеса  -> 13 (platten_pin) 1 тепловая завеса вкл/ 0 откл
*/
const int gercon_pin = A2;
uint8_t gercon, gercon_old; // новое и старое состояние геркона 0 откр/ 1закр
const int platten_pin = 13;
uint8_t platten; // состояние тепловой завесы 1 вкл/ 0 откр
uint8_t platten_ON = 0; //
uint8_t platten_OFF = 0; //

void setup() {
  //#1
  pinMode(gercon_pin, INPUT_PULLUP);
  gercon = digitalRead(gercon_pin);
  pinMode(platten_pin, OUTPUT); //инициализировать
  digitalWrite(platten_pin, platten = 0); // отключить тепловую занавесь
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1
  static uint32_t fut1 = 0 ;
  static uint32_t future1 = 0 ;
  if (platten_ON  && MILLIS >= fut1) {
    digitalWrite(platten_pin, platten = 1);; // включить тепловую занавесь
    platten_ON=0;
  }
  if (platten_OFF && MILLIS >= fut1) {
    digitalWrite(platten_pin, platten = 0);; // отключить тепловую занавесь
    platten_OFF=0;
  }
  if (MILLIS >= future1) {
    future1 = MILLIS + 200 ;
    gercon_old = gercon;
    gercon = digitalRead(gercon_pin);
    if (gercon_old && !gercon && !platten) {
      fut1 = MILLIS + 15000; // 15000 милисекунд 
      platten_ON = 1;
      platten_OFF=0;
    }
    if (!gercon_old && gercon && platten) {
      fut1 = MILLIS + 30000; // 30000 милисекунд 
      platten_OFF = 1;
      platten_ON=0;
    }
  }
}

Остання редакція qwone (2016-10-19 23:34:50)

Неактивний

#8 2016-10-20 10:55:15

iskander_famous
Учасник
Зареєстрований: 2016-04-13
Повідомлень: 8

Re: Включение выключение нагрузки с отсрочкой

Большое человеческое спасибо, сегодня залью, попробую погонять.

Неактивний

#9 2016-10-20 11:32:23

iskander_famous
Учасник
Зареєстрований: 2016-04-13
Повідомлень: 8

Re: Включение выключение нагрузки с отсрочкой

Проверил только что на СД все работает так как хотел. Еще раз огромное спасибо. Готов проставиться немецким пенным.

Неактивний

#10 2016-10-20 17:16:04

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Включение выключение нагрузки с отсрочкой

Спасибо за "пиво".

Остання редакція qwone (2016-10-20 18:31:00)

Неактивний

#11 2016-10-28 19:37:43

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Включение выключение нагрузки с отсрочкой

Вариант на разрыв.

/*      ***   места где произвел изменения
#1 геркон           -> A2 (gercon_pin) 1 дверь открыта / 0 закрыта          ***
   тепловая завеса  -> 13 (platten_pin) 1 тепловая завеса вкл/ 0 откл
*/
const int gercon_pin = A2;
uint8_t gercon, gercon_old; // новое и старое состояние геркона 0 откр/ 1закр
const int platten_pin = 13;
uint8_t platten; // состояние тепловой завесы 1 вкл/ 0 откр
uint8_t platten_ON = 0; //
uint8_t platten_OFF = 0; //

void setup() {
  //#1
  pinMode(gercon_pin, INPUT_PULLUP);
  gercon = ! digitalRead(gercon_pin);  // ***
  pinMode(platten_pin, OUTPUT); //инициализировать
  digitalWrite(platten_pin, platten = 0); // отключить тепловую занавесь
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1
  static uint32_t fut1 = 0 ;
  static uint32_t future1 = 0 ;
  if (platten_ON  && MILLIS >= fut1) {
    digitalWrite(platten_pin, platten = 1);; // включить тепловую занавесь
    platten_ON=0;
  }
  if (platten_OFF && MILLIS >= fut1) {
    digitalWrite(platten_pin, platten = 0);; // отключить тепловую занавесь
    platten_OFF=0;
  }
  if (MILLIS >= future1) {
    future1 = MILLIS + 200 ;
    gercon_old = gercon;
    gercon = ! digitalRead(gercon_pin); // ***
    if (gercon_old && !gercon && !platten) {
      fut1 = MILLIS + 15000; // 15000 милисекунд 
      platten_ON = 1;
      platten_OFF=0;
    }
    if (!gercon_old && gercon && platten) {
      fut1 = MILLIS + 30000; // 30000 милисекунд 
      platten_OFF = 1;
      platten_ON=0;
    }
  }
}

Неактивний

#12 2016-12-20 14:42:34

Richardovellee
Гість

Re: Включение выключение нагрузки с отсрочкой

Это да. Хочу сделать чтобы она включалась при вставлении ключа ? Как?

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму