Вопрос как раз по delay. Будь он неладен.

accente
Offline
Зарегистрирован: 18.09.2011

Приветствую. Да, я не новорег, да можете закидать ссылками или камнями)))

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

Схема скетча примерно такая:

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

const int ledPin =  A3;

void setup() {

pinMode(ledPin, OUTPUT);
  
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
      
      Serial.println( mySwitch.getReceivedValue() );
if(mySwitch.getReceivedValue()==6083900){Serial.print(" pir1 (old)");
digitalWrite(ledPin, HIGH);
delay(600000);
digitalWrite(ledPin, LOW);}
else if(mySwitch.getReceivedValue()==6083868){Serial.print(" pir2 (new) ");
digitalWrite(ledPin, HIGH);
delay(600000);
digitalWrite(ledPin, LOW);}
else if(mySwitch.getReceivedValue()==13988915){Serial.print(" door ");
digitalWrite(ledPin, HIGH);
delay(600000);
digitalWrite(ledPin, LOW);}
else {Serial.print("untitled ");
digitalWrite(ledPin, LOW);}
    }

    mySwitch.resetAvailable();
  }
}
 

Так вот. Как видно, срабатывает датчик, загорается свет, работает таймер на 5 минут. Ардуина в это время молчит. Можно ли сделать так, что допустим сработал датчик, загорелся свет на 5 минут. Проходит три минуты, сработал датчик, таймер сбросился снова на 5 минут. Т.е. при каждой сработке датчика чтобы сбрасывался таймер.

И это... Ребят, я понимаю, что для гуру вопрос довольно простой, но вот вкопался я и никак))). С чего начать и как победить? Натолкните на мысль?

sadman41
Offline
Зарегистрирован: 19.10.2016

"blink без delay"

accente
Offline
Зарегистрирован: 18.09.2011

Да, спасибо, этот материал я уже почитал, но вопрос малость в другом. Именно сброс основного таймера на начальное значение, т.к. допустим запущен цыкл на 5 минут, на их протяжении на 5 секунд несколько раз срабатывает датчик, потом нет движения и свет гаснет. Приходится махать руками))), а так как правило без движения все 5 минут не сидишь.

kasper007
Offline
Зарегистрирован: 23.05.2016

Запускайте счетчик на 5 минут каждый раз в функции проверки срабатывания датчика как раз при срабатывании датчика. В чем сложность?

accente
Offline
Зарегистрирован: 18.09.2011

Т.е. Я правильно понимаю, что в таком случае запускаем счетчик на 5 минут, но при сработке датчика этот счетчик обрывается и начинается новый цыкл?

kasper007
Offline
Зарегистрирован: 23.05.2016

accente пишет:

Т.е. Я правильно понимаю, что в таком случае запускаем счетчик на 5 минут, но при сработке датчика этот счетчик обрывается и начинается новый цыкл?

Да, именно так. Delay все поубирать и сделать как это описали выше.

b707
Offline
Зарегистрирован: 26.05.2017

accente пишет:

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

нет, вопрос именно в этом.

Пока не уберете все delay из кода, датчик у вас вовремя срабатывать не начнет.

accente
Offline
Зарегистрирован: 18.09.2011

Ребята, спасибо. Вроде понял о чем речь. Попробую разобраться. Тему можно грохнуть.

upd. Да, delay в таком коде - ну никуда вообще. Но зато при таком коде плата может реагировать на другие беспроводные датчики и команды от других ардуинок. Как я понимаю.

b707
Offline
Зарегистрирован: 26.05.2017

accente пишет:

upd. Да, delay в таком коде - ну никуда вообще. Но зато при таком коде плата может реагировать на другие беспроводные датчики и команды от других ардуинок. Как я понимаю.

неправильно понимаете.

accente
Offline
Зарегистрирован: 18.09.2011

Хм. В моем случае 1 диод (условно) и два беспроводных датчика. Если чуть пошурупить и допилить код, разве с millis это не сработает? Хотя нет, пока не стану заваливать глупыми вопросами. Сам поковыряюсь, пойму примерно что и куда, потом буду спрашивать что не понял)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

accente пишет:

Ребята, спасибо. Вроде понял о чем речь. Попробую разобраться. Тему можно грохнуть.

upd. Да, delay в таком коде - ну никуда вообще. Но зато при таком коде плата может реагировать на другие беспроводные датчики и команды от других ардуинок. Как я понимаю.


Можно и с делеем, но тогда счётчик придется опрашивать в прерывании по таймеру. :-)
Нет не может она ни на что реагировать(кроме прерываний) пока в delay

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Вам нужно примерно следующее.

if(millis()- onTime>=300000){гасим свет;}else{зажигаем свет;}
if(команда с датчика пришла){onTime=millis();}
Тут просто свет горит в течении 5 минут, после того как сработал датчик. Если в то время пока свет горит, датчик срабатывает повторно, начинаем отсчёт с начала.

accente
Offline
Зарегистрирован: 18.09.2011

Спасибо. Я примерно на то и целюсь. Только в скетче, что я указал в начале, у меня несколько датчиков. Вот вечером и опробую, как это всё вместе заставить работать.

И да, всё же спасибо еще раз))). Когда разберусь, буду с фэйдом мутить. Т.к. пока сидел сейчас размышлял, вот о чем подумал. Когда идет повторная сработка - начинаем отсчет, а соответственно и весь цыкл с начала. Или сам цыкл как-то после фэйда запускать... Загадка)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

accente пишет:

Спасибо. Я примерно на то и целюсь. Только в скетче, что я указал в начале, у меня несколько датчиков. Вот вечером и опробую, как это всё вместе заставить работать.

И да, всё же спасибо еще раз))). Когда разберусь, буду с фэйдом мутить. Т.к. пока сидел сейчас размышлял, вот о чем подумал. Когда идет повторная сработка - начинаем отсчет, а соответственно и весь цыкл с начала. Или сам цыкл как-то после фэйда запускать... Загадка)


Все тоже самое, только в условии сброса отсчёта
if(датчик1сработал || датчик2сработал || датчик597сработал){onTime=millis();}
Цикл не надо запускать, он и не останавливался, он просто следит за датчиками.

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

Надеюсь так понятнее. Вам нужен просто компонет, который выключается если нет включений хотя бы 5 минут. И все. 

ПС: Разделение на независимые компонетны, а потом сборка из них это есть самый прогрестивный прием в программировании. 

accente
Offline
Зарегистрирован: 18.09.2011

Kakmyc пишет:
accente пишет:

Ребята, спасибо. Вроде понял о чем речь. Попробую разобраться. Тему можно грохнуть.

upd. Да, delay в таком коде - ну никуда вообще. Но зато при таком коде плата может реагировать на другие беспроводные датчики и команды от других ардуинок. Как я понимаю.

Можно и с делеем, но тогда счётчик придется опрашивать в прерывании по таймеру. :-) Нет не может она ни на что реагировать(кроме прерываний) пока в delay

Я чуть неправильно сформулировал мысль. Я имел в виду millis, а то, что платка до истечения delay - просто текстолит с навеской - да, я понимаю).

Kakmyc
Offline
Зарегистрирован: 15.01.2018

qwone пишет:

Надеюсь так понятнее. Вам нужен просто компонет, который выключается если нет включений хотя бы 5 минут. И все. 

ПС: Разделение на независимые компонетны, а потом сборка из них это есть самый прогрестивный прием в программировании. 


Ппц, человек делеи пишет в программы на 10 мин, считая, что они на 5 , а вы его своими блоксхемами грузите :-)
ТС у тебя в минуте сколько секунд все же 60 или 120 ?

accente
Offline
Зарегистрирован: 18.09.2011

qwone пишет:

Надеюсь так понятнее. Вам нужен просто компонет, который выключается если нет включений хотя бы 5 минут. И все. 

ПС: Разделение на независимые компонетны, а потом сборка из них это есть самый прогрестивный прием в программировании. 

Да, смысл я уяснил. А в чем рисовали, если не секрет? Просто давно ардуинки разные валялись, сейчас руки зачесались с ними повозиться, вот и собираю в голове всё помаленьку.

accente
Offline
Зарегистрирован: 18.09.2011

Kakmyc пишет:
qwone пишет:

Надеюсь так понятнее. Вам нужен просто компонет, который выключается если нет включений хотя бы 5 минут. И все. 

ПС: Разделение на независимые компонетны, а потом сборка из них это есть самый прогрестивный прием в программировании. 

Ппц, человек делеи пишет в программы на 10 мин, считая, что они на 5 , а вы его своими блоксхемами грузите :-) ТС у тебя в минуте сколько секунд все же 60 или 120 ?

Да ну я не совсем уж прям совсем деревянный, просто про millis не знал) А то, что 5 минут это 300000 ms я знаю. Просто внимания не обратил. Всякой ерундой когда маялся, делеи ставил разные, вот и осело в голове 300, 600...

accente
Offline
Зарегистрирован: 18.09.2011

Ах да, ребят, для управления лентой пользую простой irf540n. Это нормально или чем-то грозит? Естественно потребление считаю заранее.

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

Kakmyc пишет:
пц, человек делеи пишет в программы на 10 мин, считая, что они на 5 , а вы его своими блоксхемами грузите :-) ТС у тебя в минуте сколько секунд все же 60 или 120 ?

 Ну это скорее структурная схема. И пока человек не научится программировать структурно, то будет в болоте новичков тонуть.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Да уж . Не зря все учебники по информатике начинаются темой, про алгоритмы.
Только толку. Большинство людей а принципе никогда не пытались осмыслить, даже последовательность своих действий, что уж говорить о последовательности действий машины :-)

accente
Offline
Зарегистрирован: 18.09.2011

Исправлюсь. Просто всегда воспринимал ардуинку как однозадачную плату, с соответственно линейным алгоритмом. Но в таком контексте не рассматривал. Про алгоритмы - да, моё упущение, поразбираюсь.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

accente пишет:

Исправлюсь. Просто всегда воспринимал ардуинку как однозадачную плату, с соответственно линейным алгоритмом. Но в таком контексте не рассматривал. Про алгоритмы - да, моё упущение, поразбираюсь.


Все правильно, алгоритмы линейные и последовательные, только ничего не мешает в каждом цикле проверять условия на истинность и менять линейность, а также переводческих по времени(или по команде), отвлекаться на выполнение других задач и условий.

accente
Offline
Зарегистрирован: 18.09.2011

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

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

accente пишет:

Исправлюсь. Просто всегда воспринимал ардуинку как однозадачную плату, с соответственно линейным алгоритмом. Но в таком контексте не рассматривал. Про алгоритмы - да, моё упущение, поразбираюсь.

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

/**/
//------------Led-----------------------------
const int ledPin =/*пин*/A3;
bool Led;
unsigned long past;
const unsigned long time5min = 600000;
void LedOFF() {
  Led = 0;
  digitalWrite(ledPin, LOW);
}
void LedON() {
  past = time5min;
  past=millis();
  Led = 1;
  digitalWrite(ledPin, HIGH);
}
void LedInit() {
  pinMode(ledPin, OUTPUT);
  LedOFF();
}
void LedRun() {
  if (Led == 1 && millis() - past >= time5min)LedOFF();
}
//-----------RCSwitch приемник----------------
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
void RCSwitchInit() {
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}
void RCSwitchRun() {
  if (mySwitch.available()) {
    int value = mySwitch.getReceivedValue();
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
      Serial.println( mySwitch.getReceivedValue() );
      if (mySwitch.getReceivedValue() == 6083900) {
        LedON();
      }
      else if (mySwitch.getReceivedValue() == 6083868) {
        Serial.print(" pir2 (new) ");
        LedON();
      }
      else if (mySwitch.getReceivedValue() == 13988915) {
        Serial.print(" door ");
        LedON();
      }
      else {
        Serial.print("untitled ");
        LedOFF();
      }
    }
    mySwitch.resetAvailable();
  }
}
//------------Main--------------------------
void setup() {
  Serial.begin(9600);
  LedInit();
  RCSwitchInit();
}
void loop() {
  LedRun();
  RCSwitchRun();
}
/**/

У меня нет вашей библиотеки. Так что я не компилировал.

accente
Offline
Зарегистрирован: 18.09.2011

qwone пишет:

accente пишет:

Исправлюсь. Просто всегда воспринимал ардуинку как однозадачную плату, с соответственно линейным алгоритмом. Но в таком контексте не рассматривал. Про алгоритмы - да, моё упущение, поразбираюсь.

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

/**/
//------------Led-----------------------------
const int ledPin =/*пин*/A3;
bool Led;
unsigned long past;
const unsigned long time5min = 600000;
void LedOFF() {
  Led = 0;
  digitalWrite(ledPin, LOW);
}
void LedON() {
  past = time5min;
  past=millis();
  Led = 1;
  digitalWrite(ledPin, HIGH);
}
void LedInit() {
  pinMode(ledPin, OUTPUT);
  LedOFF();
}
void LedRun() {
  if (Led == 1 && millis() - past >= time5min)LedOFF();
}
//-----------RCSwitch приемник----------------
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
void RCSwitchInit() {
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}
void RCSwitchRun() {
  if (mySwitch.available()) {
    int value = mySwitch.getReceivedValue();
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
      Serial.println( mySwitch.getReceivedValue() );
      if (mySwitch.getReceivedValue() == 6083900) {
        LedON();
      }
      else if (mySwitch.getReceivedValue() == 6083868) {
        Serial.print(" pir2 (new) ");
        LedON();
      }
      else if (mySwitch.getReceivedValue() == 13988915) {
        Serial.print(" door ");
        LedON();
      }
      else {
        Serial.print("untitled ");
        LedOFF();
      }
    }
    mySwitch.resetAvailable();
  }
}
//------------Main--------------------------
void setup() {
  Serial.begin(9600);
  LedInit();
  RCSwitchInit();
}
void loop() {
  LedRun();
  RCSwitchRun();
}
/**/

У меня нет вашей библиотеки. Так что я не компилировал.

Спасибо! Руки чесались попробовать. Попробовал, всё работает. Буду разбираться в коде. Ну и как советовали выше - сперва алгоритмы!

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

qwone пишет:

 Ну это скорее структурная схема.

Это вообще отсебятина какая-то, никому кроме вас не понятная.

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

triac пишет:
Это вообще отсебятина какая-то, никому кроме вас не понятная.
  А вы книгу переверните. Вы ее верх ногами читаете. Да читать надо не только глазами но и умом. Я не зря привел схему и скетч. 

ПС: Учитель не тот кто учит, а тот у кого вы учитесь. И если вы не способны учится даже у дибилов и идиотов, то вы просто не способны учится.

accente пишет:
Спасибо! Руки чесались попробовать. Попробовал, всё работает. Буду разбираться в коде. Ну и как советовали выше - сперва алгоритмы!
Главное уметь создавать объекты(компоненты) . Каждый объект это свойства и методы (переменные и функции их обрабатывающие). Всю программу разбиваете на "черные ящики", и прикидываете как управлять каждым ящиком. Стрелочка входящая это метод этого объекта. Стрелочка исходящая- кто этот метод вызывает.