Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.09.2015, 17:22   #1
electric
Member
 
Регистрация: 29.03.2013
Сообщений: 68
Вес репутации: 0
electric is an unknown quantity at this point
По умолчанию Кратковременное включение реле Arduino без delay()

Всем привет.
Прошу помощи в написании кода для ардуины.
Мне надо на вход ПЛК подать кратковременный сигнал от релюшки, секунды 4-5 чтобы держался. Пытаюсь написать программу для ардуины так, чтобы без функции delay(). Поискав информацию в инете, понял, что надо использовать прерывание по таймеру. А вот как это сделать, какую библиотеку использовать - голову уже сломал, не могу разобраться...
Может что посоветуете?
Спасибо!

Последний раз редактировалось electric; 03.09.2015 в 17:25.
electric вне форума   Ответить с цитированием
Старый 03.09.2015, 17:48   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Кратковременное включение реле Arduino без delay()

Если ардуина на ATmega328 то можно использовать библиотеку CyberLib

Можно и без прерываний обойтись
Я думаю что этого примера будет достаточно , что бы написать код под себя

Данный код выполняет Вашу функцию каждые 600 сек.
Код:
uint32_t time=600000;
void loop() 
{
 if( millis()-time > 600000) //  задан интервал 600сек.
 {
  //здесь должен быть Ваш код или вызов функции
  time = millis();
 }
}
Admin вне форума   Ответить с цитированием
Старый 04.09.2015, 10:23   #3
electric
Member
 
Регистрация: 29.03.2013
Сообщений: 68
Вес репутации: 0
electric is an unknown quantity at this point
По умолчанию Re: Кратковременное включение реле Arduino без delay()

Цитата:
Сообщение от Admin Посмотреть сообщение
Если ардуина на ATmega328 то можно использовать библиотеку CyberLib

Можно и без прерываний обойтись
Я думаю что этого примера будет достаточно , что бы написать код под себя

Данный код выполняет Вашу функциу каждые 600 сек.
Код:
uint32_t time=600000;
void loop() 
{
 if( millis()-time > 600000) //  задан интервал 600сек.
 {
  //здесь должен быть Ваш код или вызов функции
  time = millis();
 }
}
Благодарю, но это не совсем то.
У меня ардуина MEGA2560 и таймер хочу запускать немного по-другому - в основной программе включаю реле и передаю управлению таймеру по прерыванию с указанием времени на отключение. Через заданный промежуток времени прерывание срабатывает и реле отключается, при этом таймер "встает", т.е. повторно не срабатывает, как то так что ли...
electric вне форума   Ответить с цитированием
Старый 04.09.2015, 19:42   #4
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Кратковременное включение реле Arduino без delay()

а что будет делать мега2560 после того как отключит реле по таймеру?
Arhat109 вне форума   Ответить с цитированием
Старый 07.09.2015, 10:59   #5
electric
Member
 
Регистрация: 29.03.2013
Сообщений: 68
Вес репутации: 0
electric is an unknown quantity at this point
По умолчанию Re: Кратковременное включение реле Arduino без delay()

Цитата:
Сообщение от Arhat109 Посмотреть сообщение
а что будет делать мега2560 после того как отключит реле по таймеру?
Продолжать работу дальше по основному циклу.
Если по условиям программы надо будет еще щелкнуть реле - то опять включит, запустит таймер и через определенное время выключит...
Блин, так и не разобрался с таймерами, сделал через милис костыль, но чувствую, так нельзя делать))))
electric вне форума   Ответить с цитированием
Старый 29.01.2016, 08:41   #6
anatoliylagutenko
Member
 
Регистрация: 12.01.2016
Адрес: Кривой Рог
Сообщений: 36
Вес репутации: 0
anatoliylagutenko is an unknown quantity at this point
По умолчанию Re: Кратковременное включение реле Arduino без delay()

Цитата:
Сообщение от electric Посмотреть сообщение
Продолжать работу дальше по основному циклу.
Если по условиям программы надо будет еще щелкнуть реле - то опять включит, запустит таймер и через определенное время выключит...
Блин, так и не разобрался с таймерами, сделал через милис костыль, но чувствую, так нельзя делать))))
Я извиняюсь, а тема ещё актуальна?
Могу предложить пример скетча написанный под сигнализацию и там этот вопрос решён.
anatoliylagutenko вне форума   Ответить с цитированием
Старый 29.01.2016, 15:55   #7
gnom537
Member
 
Регистрация: 07.08.2014
Сообщений: 37
Вес репутации: 0
gnom537 is an unknown quantity at this point
По умолчанию Re: Кратковременное включение реле Arduino без delay()

anatoliylagutenko а можете выложить скетч для повышения образованности! заранее спасибо.
gnom537 вне форума   Ответить с цитированием
Старый 29.01.2016, 20:10   #8
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1310
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию Re: Кратковременное включение реле Arduino без delay()

PHP код:
uint32_t time=600000;
byte flag 1;

void setup()
{
}


void loop() 
{
  if(
flag)
   {
      if(
millis()-time 600000//  задан интервал 600сек.
       
{
          
flag 0;
          
//здесь должен быть Ваш код или вызов функции
          
time millis();
       }
   }
 
   
// здесь что-то, что выставит флаг в единицу
   // flag = 1;


millis обнуляется каждые 50 дней
__________________
istarik.ru

Последний раз редактировалось stD; 29.01.2016 в 20:13.
stD вне форума   Ответить с цитированием
Старый 30.06.2017, 10:57   #9
MIKI
Senior Member
 
Регистрация: 21.06.2013
Адрес: Москва
Сообщений: 176
Вес репутации: 0
MIKI is a jewel in the roughMIKI is a jewel in the roughMIKI is a jewel in the rough
По умолчанию Таймер задержки отключения на НАНО

На основе примеров из интернета составил скетч.Вроде все работает,но чувствую что-то неправильно.Огромная просьба проверить код.
Логика такова:при появлении +5в на входе 2 включается выход АО и работает 2сек независимо есть ли на входе +5в или нету.
Вот код:
PHP код:
#define ledPin1 A0  //Реле 1 - управление

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

void setup()    


  
pinMode(ledPin1OUTPUT); //иниц выхода


void loop() 


  
 if(
digitalRead(2)==HIGH)//если кнопка нажата ... 
  

    
flagA=1;
    
  }
  if(
flagA==1)
  {

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

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

    
digitalWrite(ledPin1,LOW);


  }
  if(
digitalRead(2)==LOW)//если кнопка не нажата ... 
  

    
flagA=0;
    
digitalWrite(ledPin1,LOW); //выключаем ledPin1 
    
valA=0;//обнуляем переменную
     
  



MIKI вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 16:25. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика