Вопрос как раз по delay. Будь он неладен.
- Войдите на сайт для отправки комментариев
Приветствую. Да, я не новорег, да можете закидать ссылками или камнями)))
Но вот только никак я не могу понять одной вещи... Да, я разобрался с беспроводной передачей данных от одной ардуинки к другой, да, они управляют светом в коридоре и на кухне. Но это ладно.
Схема скетча примерно такая:
#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 минут. Т.е. при каждой сработке датчика чтобы сбрасывался таймер.
И это... Ребят, я понимаю, что для гуру вопрос довольно простой, но вот вкопался я и никак))). С чего начать и как победить? Натолкните на мысль?
"blink без delay"
Да, спасибо, этот материал я уже почитал, но вопрос малость в другом. Именно сброс основного таймера на начальное значение, т.к. допустим запущен цыкл на 5 минут, на их протяжении на 5 секунд несколько раз срабатывает датчик, потом нет движения и свет гаснет. Приходится махать руками))), а так как правило без движения все 5 минут не сидишь.
Запускайте счетчик на 5 минут каждый раз в функции проверки срабатывания датчика как раз при срабатывании датчика. В чем сложность?
Т.е. Я правильно понимаю, что в таком случае запускаем счетчик на 5 минут, но при сработке датчика этот счетчик обрывается и начинается новый цыкл?
Т.е. Я правильно понимаю, что в таком случае запускаем счетчик на 5 минут, но при сработке датчика этот счетчик обрывается и начинается новый цыкл?
Да, именно так. Delay все поубирать и сделать как это описали выше.
Да, спасибо, этот материал я уже почитал, но вопрос малость в другом.
нет, вопрос именно в этом.
Пока не уберете все delay из кода, датчик у вас вовремя срабатывать не начнет.
Ребята, спасибо. Вроде понял о чем речь. Попробую разобраться. Тему можно грохнуть.
upd. Да, delay в таком коде - ну никуда вообще. Но зато при таком коде плата может реагировать на другие беспроводные датчики и команды от других ардуинок. Как я понимаю.
upd. Да, delay в таком коде - ну никуда вообще. Но зато при таком коде плата может реагировать на другие беспроводные датчики и команды от других ардуинок. Как я понимаю.
неправильно понимаете.
Хм. В моем случае 1 диод (условно) и два беспроводных датчика. Если чуть пошурупить и допилить код, разве с millis это не сработает? Хотя нет, пока не стану заваливать глупыми вопросами. Сам поковыряюсь, пойму примерно что и куда, потом буду спрашивать что не понял)
Ребята, спасибо. Вроде понял о чем речь. Попробую разобраться. Тему можно грохнуть.
upd. Да, delay в таком коде - ну никуда вообще. Но зато при таком коде плата может реагировать на другие беспроводные датчики и команды от других ардуинок. Как я понимаю.
Можно и с делеем, но тогда счётчик придется опрашивать в прерывании по таймеру. :-)
Нет не может она ни на что реагировать(кроме прерываний) пока в delay
Вам нужно примерно следующее.
if(millis()- onTime>=300000){гасим свет;}else{зажигаем свет;}
if(команда с датчика пришла){onTime=millis();}
Тут просто свет горит в течении 5 минут, после того как сработал датчик. Если в то время пока свет горит, датчик срабатывает повторно, начинаем отсчёт с начала.
Спасибо. Я примерно на то и целюсь. Только в скетче, что я указал в начале, у меня несколько датчиков. Вот вечером и опробую, как это всё вместе заставить работать.
И да, всё же спасибо еще раз))). Когда разберусь, буду с фэйдом мутить. Т.к. пока сидел сейчас размышлял, вот о чем подумал. Когда идет повторная сработка - начинаем отсчет, а соответственно и весь цыкл с начала. Или сам цыкл как-то после фэйда запускать... Загадка)
Спасибо. Я примерно на то и целюсь. Только в скетче, что я указал в начале, у меня несколько датчиков. Вот вечером и опробую, как это всё вместе заставить работать.
И да, всё же спасибо еще раз))). Когда разберусь, буду с фэйдом мутить. Т.к. пока сидел сейчас размышлял, вот о чем подумал. Когда идет повторная сработка - начинаем отсчет, а соответственно и весь цыкл с начала. Или сам цыкл как-то после фэйда запускать... Загадка)
Все тоже самое, только в условии сброса отсчёта
if(датчик1сработал || датчик2сработал || датчик597сработал){onTime=millis();}
Цикл не надо запускать, он и не останавливался, он просто следит за датчиками.
Надеюсь так понятнее. Вам нужен просто компонет, который выключается если нет включений хотя бы 5 минут. И все.
ПС: Разделение на независимые компонетны, а потом сборка из них это есть самый прогрестивный прием в программировании.
Ребята, спасибо. Вроде понял о чем речь. Попробую разобраться. Тему можно грохнуть.
upd. Да, delay в таком коде - ну никуда вообще. Но зато при таком коде плата может реагировать на другие беспроводные датчики и команды от других ардуинок. Как я понимаю.
Я чуть неправильно сформулировал мысль. Я имел в виду millis, а то, что платка до истечения delay - просто текстолит с навеской - да, я понимаю).
Надеюсь так понятнее. Вам нужен просто компонет, который выключается если нет включений хотя бы 5 минут. И все.
ПС: Разделение на независимые компонетны, а потом сборка из них это есть самый прогрестивный прием в программировании.
Ппц, человек делеи пишет в программы на 10 мин, считая, что они на 5 , а вы его своими блоксхемами грузите :-)
ТС у тебя в минуте сколько секунд все же 60 или 120 ?
Надеюсь так понятнее. Вам нужен просто компонет, который выключается если нет включений хотя бы 5 минут. И все.
ПС: Разделение на независимые компонетны, а потом сборка из них это есть самый прогрестивный прием в программировании.
Да, смысл я уяснил. А в чем рисовали, если не секрет? Просто давно ардуинки разные валялись, сейчас руки зачесались с ними повозиться, вот и собираю в голове всё помаленьку.
Надеюсь так понятнее. Вам нужен просто компонет, который выключается если нет включений хотя бы 5 минут. И все.
ПС: Разделение на независимые компонетны, а потом сборка из них это есть самый прогрестивный прием в программировании.
Да ну я не совсем уж прям совсем деревянный, просто про millis не знал) А то, что 5 минут это 300000 ms я знаю. Просто внимания не обратил. Всякой ерундой когда маялся, делеи ставил разные, вот и осело в голове 300, 600...
Ах да, ребят, для управления лентой пользую простой irf540n. Это нормально или чем-то грозит? Естественно потребление считаю заранее.
Ну это скорее структурная схема. И пока человек не научится программировать структурно, то будет в болоте новичков тонуть.
Да уж . Не зря все учебники по информатике начинаются темой, про алгоритмы.
Только толку. Большинство людей а принципе никогда не пытались осмыслить, даже последовательность своих действий, что уж говорить о последовательности действий машины :-)
Исправлюсь. Просто всегда воспринимал ардуинку как однозадачную плату, с соответственно линейным алгоритмом. Но в таком контексте не рассматривал. Про алгоритмы - да, моё упущение, поразбираюсь.
Исправлюсь. Просто всегда воспринимал ардуинку как однозадачную плату, с соответственно линейным алгоритмом. Но в таком контексте не рассматривал. Про алгоритмы - да, моё упущение, поразбираюсь.
Все правильно, алгоритмы линейные и последовательные, только ничего не мешает в каждом цикле проверять условия на истинность и менять линейность, а также переводческих по времени(или по команде), отвлекаться на выполнение других задач и условий.
О том и речь, что я про них практически ничего не знаю. Надо изучать, разбираться, а не хватать кусками. Ничего не выйдет толкового так.
Исправлюсь. Просто всегда воспринимал ардуинку как однозадачную плату, с соответственно линейным алгоритмом. Но в таком контексте не рассматривал. Про алгоритмы - да, моё упущение, поразбираюсь.
/**/ //------------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(); } /**/У меня нет вашей библиотеки. Так что я не компилировал.
Исправлюсь. Просто всегда воспринимал ардуинку как однозадачную плату, с соответственно линейным алгоритмом. Но в таком контексте не рассматривал. Про алгоритмы - да, моё упущение, поразбираюсь.
/**/ //------------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(); } /**/У меня нет вашей библиотеки. Так что я не компилировал.
Спасибо! Руки чесались попробовать. Попробовал, всё работает. Буду разбираться в коде. Ну и как советовали выше - сперва алгоритмы!
Ну это скорее структурная схема.
Это вообще отсебятина какая-то, никому кроме вас не понятная.
ПС: Учитель не тот кто учит, а тот у кого вы учитесь. И если вы не способны учится даже у дибилов и идиотов, то вы просто не способны учится.