Удерживать реле включенным после подачи сигнала по таймеру

SultanRR
Offline
Зарегистрирован: 03.01.2019

Доброго времени )

Не получается у меня разобраться в простейшием ((

Нужно реализовать : после подачи сиграла (импульса скнопки,геркона и т.п) включить реле  и удерживать его включеным в течении допустим минуты но если в этот период проидет еще один импульс по вводу то обнулить таймер и произвести отключение реле спустя минуту только после последнего сигнала на вводе (импульс с кнопки или геркона и т.п)

sadman41
Онлайн
Зарегистрирован: 19.10.2016

И в чем вопрос - неужели "как прописать в скетче"?

SultanRR
Offline
Зарегистрирован: 03.01.2019
unsigned long counttime; 

void setup()
{
pinMode(8, OUTPUT);
pinMode(4, INPUT);
}

void loop()
{
if (digitalRead(4) == HIGH) { digitalWrite(8, HIGH); }

if (digitalRead(4) == LOW) {

counttime = millis();
millis() - counttime > 60000;

digitalWrite(8, LOW);
}
}

Что я тут не правильно делаю ?) Спасибо )

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

SultanRR пишет:

Доброго времени )

Не получается у меня разобраться в простейшием ((

Нужно реализовать : после подачи сиграла (импульса скнопки,геркона и т.п) включить реле  и удерживать его включеным в течении допустим минуты но если в этот период проидет еще один импульс по вводу то обнулить таймер и произвести отключение реле спустя минуту только после последнего сигнала на вводе (импульс с кнопки или геркона и т.п)

Вот представьте, что вместо сигнала - лампочка, вместо реле - кнопка и еще у ас есть часы. А вместо микроконтроллера - Вы.

Сумели бы Вы справиться с постевленной задачей?

Вот и напишите подробно, как именно Вы стали бы действовать в подобной ситуации.

Открою тайну - микроконтроллер должен действовать в точности так же.

Так что:

1. Напишите порядок своих действий по-русски, используя, кроме прочего, конструкцию "если ... то".

2. Переведите с русского на Си.

 

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

SultanRR пишет:
Что я тут не правильно делаю ?) Спасибо )
Начните с алгоритма по-русски.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

SultanRR пишет:

Что я тут не правильно делаю ?) Спасибо )

Строки 15 и 16 что по вашей задумке делают?

SultanRR
Offline
Зарегистрирован: 03.01.2019

sadman41 пишет:

Строки 15 и 16 что по вашей задумке делают?

 

запускает счетчик на 60 секунд

sadman41
Онлайн
Зарегистрирован: 19.10.2016

А по условию задачи счетчик надо запускать когда? Подумайте, почему реле включаете в одном месте, а "счетчик запускаете" в совершенно другом.

И по поводу строки 16 неясно совершенно - как вы ее вообще придумали.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

SultanRR пишет:
Не получается у меня разобраться в простейшием
Что бы разобраться в простейшем, надо сначало выявить это простейшее. А у Вас отсутсвие понимания теории. 1- у механического контакта дребезг  2- надо ловить фронт нажатия, а не уровень нажатия. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SultanRR пишет:

Не получается у меня разобраться в простейшием ((

Видать, не настолько и "простейшее", раз не можете. Нет?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

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

SultanRR
Offline
Зарегистрирован: 03.01.2019

проблему дребизга опустим пока что . в настоящий момент пока собираю схему использую обычную кнопку с подтягивающим резистором на -

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Позвольте пару наводящих вопросов:

- Реле должно "сработать" по нажитию или отпусканию? 

- Реле должно "отпустить" через минуту после нажатия кнопки или через минуту после отпускания?

- Что должно происходить если мы кнопку нажали и не отпускаем?

SultanRR
Offline
Зарегистрирован: 03.01.2019

asam пишет:

Позвольте пару наводящих вопросов:

- Реле должно "сработать" по нажитию или отпусканию? 

- Реле должно "отпустить" через минуту после нажатия кнопки или через минуту после отпускания?

- Что должно происходить если мы кнопку нажали и не отпускаем?

по нажатию . если нажать и держать отсчитывать от момента нажатия

Sylver
Offline
Зарегистрирован: 26.11.2018

Извиняюсь, что влезаю... Просто практикуюсь...
Но реле будет включено пока держат кнопку...

void loop()
{
if (digitalRead(4) == HIGH)
   { 
     digitalWrite(8, HIGH); 
     counttime = millis();
   }
if ((millis() - counttime)>60000)
  {
     digitalWrite(8, LOW);
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sylver пишет:

Но реле будет включено пока держат кнопку...

С чего Вы взяли? Отпускайте конпку на здоровье, а реле всё равно 10сек будет включено.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

SultanRR пишет:

unsigned long counttime; 

void setup()
{
pinMode(8, OUTPUT);
pinMode(4, INPUT);
}

void loop()
{
if (digitalRead(4) == HIGH) { digitalWrite(8, HIGH); }

if (digitalRead(4) == LOW) {

counttime = millis();
millis() - counttime > 60000;

digitalWrite(8, LOW);
}
}

Что я тут не правильно делаю ?) Спасибо )

Может надо так!

unsigned long counttime; 

void setup()
{
  pinMode(8, OUTPUT);
  pinMode(4, INPUT);
}

void loop()
{
  if (digitalRead(4) == HIGH) { 
    digitalWrite(8, HIGH); 
    counttime = millis();
  }

  if (millis() - counttime > 60000) {
    digitalWrite(8, LOW);
  }
}

 

Sylver
Offline
Зарегистрирован: 26.11.2018

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

Или нажатие кнопки формирует импульс, а не постоянную единицу на входе?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Sylver пишет:

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

Или нажатие кнопки формирует импульс, а не постоянную единицу на входе?

Если держать кнопку то да Вы правы, а если нужен импульс то надо добавит еще одну переменную. Например так

unsigned long counttime; 
bool impuls;

void setup()
{
  pinMode(8, OUTPUT);
  pinMode(4, INPUT);
}

void loop()
{
  if (digitalRead(4) == HIGH && !impuls) {
    impuls = 1; 
    digitalWrite(8, HIGH); 
    counttime = millis();
  }

  if (millis() - counttime > 60000) {
    impuls = 0;
    digitalWrite(8, LOW);
  }
}

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Соглвсно ТЗ повторное нажатие должно сбрасывать таймер, а тут на кнопку вообще реагировать не будет пока время не истечет.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

asam пишет:

Соглвсно ТЗ повторное нажатие должно сбрасывать таймер, а тут на кнопку вообще реагировать не будет пока время не истечет.

Да Вы правы недоглядел. надо

unsigned long counttime; 
bool impuls;

void setup()
{
  pinMode(8, OUTPUT);
  pinMode(4, INPUT);
}

void loop()
{
  if (digitalRead(4) == HIGH && !impuls) {
    impuls = 1; 
    digitalWrite(8, HIGH); 
    counttime = millis();
  }

  if(!digitalRead(4))impuls = 0;

  if (millis() - counttime > 60000) {
    digitalWrite(8, LOW);
  }
}

 

alex_mogilev
Offline
Зарегистрирован: 04.01.2019

Вот это если хотите посмотреть что происходит в монитор порте:

unsigned long counttime; //переменая для хранения последнего слабатывания
                         //дребезг нам не влияет, т.к. это милисикунды
                         //а мы мереем 1 минуту
unsigned long zaderzhka = 2000; //время задержки
unsigned long id_tem;
int x = 1;
void setup()

{
  Serial.begin(9600);
  pinMode(13, OUTPUT); //устанавливаем выход
  pinMode(41, INPUT_PULLUP); //устонавливаем вход кнопки
}

void loop()
{
 x = digitalRead(41);
 if (x == LOW) { //каждый раз пока кнопка нажата или
    digitalWrite(13, HIGH);      //дребезг переменая пишит новое значение
    counttime = millis();
  }

delays();  

  if (millis() - counttime > 60000) { //сравнивает значение с результатом действия 
    digitalWrite(13, LOW);             //и выключает если больше
  }

}

//этот код для визуализации в монитор порт
void delays (void){
if (zaderzhka < millis()-id_tem){
  id_tem = millis();
Serial.print("x:");
Serial.println(x);
Serial.print("counttime:");
Serial.println(counttime);
Serial.print("millis():");
Serial.println(millis());

}
}  

 

alex_mogilev
Offline
Зарегистрирован: 04.01.2019

так у меня работает, а так должно у вас заработать:

unsigned long counttime; //переменая для хранения последнего слабатывания
                         //дребезг нам не влияет, т.к. это милисикунды
 
 int x = 0;                        //а мы мереем 1 минуту
void setup()

{
  pinMode(8, OUTPUT); //устанавливаем выход
  pinMode(4, INPUT_PULLUP); //устонавливаем вход кнопки 
}                            //не разбирался но походу с внутреним подтягивающем резисторам
                              //""""INPUT_PULLUP""""
void loop()
{
 x = digitalRead(4);
 if (x == HIGH) { //каждый раз пока кнопка нажата или
    digitalWrite(8, HIGH);      //дребезг переменая пишит новое значение
    counttime = millis();
  }



  if (millis() - counttime > 60000) { //сравнивает значение с результатом действия 
    digitalWrite(8, LOW);             //и выключает если больше
  }

}
SultanRR
Offline
Зарегистрирован: 03.01.2019

Всем спасибо ) С этим я разобрался ))

Но появился вопрос правда немнго не потеме . Купил 5 плат у 2хразных продавцов у одного 2 у другого 3 .Написав скетч под платы купленые у первого и залив его на платы купленые у другого продавца он работать не стал (тоесть на 2 работате на 3 нет) .Брак или имеет место быть такое ?))

unsigned long counttime; 

#include <RCSwitch.h>
#define RELE1 7
#define RELE2 8
#define RELE4 11
#define RELE3 12
boolean RELELED = false ;

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(115200);
  pinMode (RELE1, OUTPUT);
  pinMode (RELE2, OUTPUT);
  pinMode (RELE3, OUTPUT);
  pinMode (RELE4, OUTPUT);
  pinMode (4, INPUT);
  digitalWrite(RELE1, HIGH);
  digitalWrite(RELE2, HIGH);
  digitalWrite(RELE3, HIGH);
  digitalWrite(RELE4, HIGH);
  digitalWrite(4, HIGH);
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {

    int value = mySwitch.getReceivedValue();
     delay (100);

    if (value == 0) {
      Serial.print("Unknown encoding");
    }
    else {
      Serial.print("Received ");
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
    }
if (mySwitch.getReceivedValue()==2053312)
{
  digitalWrite(RELE2, LOW);
  digitalWrite(RELE1, HIGH);
  delay (400);
  digitalWrite(RELE1, HIGH);
  digitalWrite(RELE2, HIGH);
}
if (mySwitch.getReceivedValue()==2053132)
{
  digitalWrite(RELE1, LOW);
  digitalWrite(RELE2, HIGH);
    delay (400);
  digitalWrite(RELE1, HIGH);
  digitalWrite(RELE2, HIGH);
}
if (mySwitch.getReceivedValue()==2053168)
{
  RELELED = !RELELED;
  digitalWrite(RELE4, RELELED);
}
if (mySwitch.getReceivedValue()==7346112)
{
  digitalWrite(RELE2, LOW);
  digitalWrite(RELE1, HIGH);
    delay (400);
  digitalWrite(RELE1, HIGH);
  digitalWrite(RELE2, HIGH);
}
if (mySwitch.getReceivedValue()==7345932)
{
  digitalWrite(RELE1, LOW);
  digitalWrite(RELE2, HIGH);
      delay (400);
  digitalWrite(RELE1, HIGH);
  digitalWrite(RELE2, HIGH);
}
if (mySwitch.getReceivedValue()==7345968)
{
  digitalWrite(RELE1, HIGH);
  digitalWrite(RELE2, HIGH);
}
    mySwitch.resetAvailable();
  }
  if(digitalRead(4) == 1)
  {digitalWrite(RELE3, LOW);
  delay (600);
  counttime = millis();
  }
  if(digitalRead(4) == 0) {
  }
  if (millis() - counttime > 90000)
  {digitalWrite(RELE3,  HIGH);
  }
}

 

alex_mogilev
Offline
Зарегистрирован: 04.01.2019

А я вчера на базаре купил кило картошки, дома только увидел что половина красная а вторая белая, не знаю что делать)))

SultanRR
Offline
Зарегистрирован: 03.01.2019

alex_mogilev пишет:
А я вчера на базаре купил кило картошки, дома только увидел что половина красная а вторая белая, не знаю что делать)))

))))) Но все таки я предпологал что есть некий стандарт но выходит что нет )

 

alex_mogilev
Offline
Зарегистрирован: 04.01.2019

Я имел ввиду что за платы, что делают...

SultanRR
Offline
Зарегистрирован: 03.01.2019

alex_mogilev пишет:
Я имел ввиду что за платы, что делают...

 

все ардуино уно  которые брал у второго продавца отличаются тем что нужно было установить драйвер 

CH340G , должно выполняться при нажатии на пульте 433мгц кнопки 1 кратковременно должна щелкнуть реле 1 для кнопки 2 щелкнуть реле 2 для кнопки 3 ВКЛ/ВЫКЛ реле 4 , при отсутствии сигнала (разрыв gnd и четвертого входа)на вход 4 включиться реле  3 и после пойвления сигнала через 90 сек выкл реле .

Все работает отлично на 2 платах , а на трех другого продавана сразу срабатывают все реле как написано в начале скетча  и все )) исправить скетч не сложно но просто я думал платформы все в одной линейке одинаковы

alex_mogilev
Offline
Зарегистрирован: 04.01.2019

Попробуйте посмотреть через Serial.print значение к примеру mySwitch.getReceivedValue() перед if. Вы каждый раз его поидеи считываите, присвойте его переменой а потом уже с этой переменой работайте. Отступлю от темы почему именно советую serial.print, т. к. мне очень это помогает чтобы помять как работают мои программы.

SultanRR
Offline
Зарегистрирован: 03.01.2019

Попробую )

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Что, опять китайцы свинью подложили? Так год такой грядет...

alex_mogilev
Offline
Зарегистрирован: 04.01.2019

Кстати вспомнил к примеру: в одном моем устройстве был нюанс, оно скидывало за несколько секунд около 7000 значений в порт без задержки, так вот компьютер их все успевал принять и отобразить, а телефон при приёме афигивал, и переставал принимать сразу лишь когда передача заканчивалась он отображал штук 30 значений и то что в середине принимал, пришлось делать регулированию delay на 30 мили секунд после каждой передачи на телефон, только после этого он принимал все 7000 значений

lebrikon
Offline
Зарегистрирован: 09.01.2019

Доброго времени суток..Мужики помогите..

Есть два реле ,датчик пламени,температурный датчик.

Задача такая ,при температуре меньше (22) и если реле2(разомкнуто)а датчик пламени (LOW).

то замыкаем реле1ждем (3000) и замыкаем реле2 ждем пока датчик пламени (HIGH)ждем (2000)выключаем  реле1.

контролируем датчик пламени если (LOW) а реле2 замкнуто и температура не достигла (25) замыкаем реле 1 ждем датчик пламени(HIGH).

Реле2 остаеться включеным пока температура не будет равна (25).    

ЗАРАНИЕ БЛАГОДАРЕН..    Все собрал подключил все работает но с языком проблемы только учусь....не получаеться собрать все условия в едино,то не включаеться,то не выключаеться...то на датчик пламени не реагирует....

b707
Онлайн
Зарегистрирован: 26.05.2017

lebrikon пишет:

Доброго времени суток..Мужики помогите..

чем помочь-то? в сообщении ни одного вопроса нет.

И сразу хочу предупредить - задавать вопросы без выкладывания СВОЕГО кода - скорее всего бессмысленно, никкой помощи не ждите, один глум.

lebrikon
Offline
Зарегистрирован: 09.01.2019

Спасибо я понял....ну код на компе а я сейчас с планшетом...если теперь завтра....вопрос был как собрать все условия в едино.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

lebrikon,почитай, разберись и сделай как там описано.
http://chipenable.ru/index.php/programming-avr/90-realizatsiya-konechnog...

lebrikon
Offline
Зарегистрирован: 09.01.2019

Ооо спасибо ....

lebrikon
Offline
Зарегистрирован: 09.01.2019

Спасибо еще раз..там массив...для меня вообще темный лес..как раз на ночь,постараюсь разобраца.хорошая статья...

Большое спасибо...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Обычный автомат. Задаешь состояния, что в каждом состоянии должно быть включено или отключено(у вас это реле и все) и условия переходов - состояние датчиков и время для дальнейшего перескока.