Код для сигнализации

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Сильно не бейте я шарю в программировании на СИ и делфи но с ардуино начал аботать недавно. Вопрос в том что как лучше реализовать следующую систему исполнения команд. Задача в том что есть 7 датчиков сигнализации. Они подключены к ардуино мега. Задача: Чтобы ардуино независимо как то каждый опрашивала и если есть сигнал, включала нагрузку на 5 мин. И продолжала опрашивать данные датчики и если получала снова сигнал то снова бы запускала как бы таймер на 5 мин. Вроде ничего сложного если говорить об 1 датчике и 1 нагружке допустим. Но я пока знаю что в ардуино есть раздел void setup и void loop - который повторяеться каждую секунду допустим. но там МК делает все по очереди. А можно ли как то чтобы многозадачность была как бы? Если нет ток как такое организовать? хотя бы натолкните на мясль)) может кто то делал, что похожее? Заранее спасибо всем кто отклюкнулся.

valera678
Offline
Зарегистрирован: 04.11.2016
Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

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

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

Seltvik пишет:
А можно ли как то чтобы многозадачность была как бы? Если нет ток как такое организовать? хотя бы натолкните на мясль)) может кто то делал, что похожее? Заранее спасибо всем кто отклюкнулся.

Многозадачность. Да легко. Вот только программное мышление вам поломает.

Вот возьмите машину- дорогу-водителя (процессор=программа= логика функционирования программы). Это обычное программирование. Можно буквально запарковать машину на середине дороги и ждать нужного события. 

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

Если ждете код, то ловите.

/*
#1
#2
#3
*/
//#1
//#2
//#3
void setup() {
  //#1
  //#2
  //#3
}
void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 1000 миллисекунд вычислит. поток 1
  static uint32_t past_1 = 0 ;
  if (MILLIS - past_1 >= 1000) { // если прошло 1000 миллисек
    past_1 = MILLIS ;
    // сам код
    MILLIS = millis() ;
  }
  //#2  200 миллисекунд вычислит. поток 2
  static uint32_t past_2 = 0 ;
  if (MILLIS - past_2 >= 200) { // если прошло 200 миллисек
    past_2 = MILLIS ;
    // сам код
    MILLIS = millis() ;
  }
  //#3  100 миллисекунд вычислит. поток 3
  static uint32_t past_3 = 0 ;
  if (MILLIS - past_3 >= 100) { // если прошло 100 миллисек
    past_3 = MILLIS ;
    // сам код
  }
}

ПС: Ну это не единсвенный вариант.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Да вы сломали мне мозг))) А как думаете может мою задачу можно и другим путем решить. Ну там придумать влаги логические и по ним прогебаться за один цикл. Я так думал. Т.е. МК опрашивает все датчики потом на каждом опросе каждого в зависимости от того есть сигнал или нет устанавливает флаг а в коце цикла он включает нагрузку но как ее включать на 5 мин не зависимо от общего цикла? Ест ьварианты? Т.е. (ДАтчик- сигнал - вкл на 5 мин) пока нагрузка включена он снова опрашивает все это добро и т.д.

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

Вы просили многозадачность Вам дали!  А если по простому то посмотрите на такой код. Задержка стоит 5 сек, если мало добавите

#define datchik1 1
#define datchik2 2
#define datchik3 3
#define datchik4 4
#define datchik5 5
#define datchik6 6
#define datchik7 7

#define rele 13
unsigned long muTimer;

void setup(){
  pinMode(datchik1, INPUT);
  pinMode(datchik2, INPUT);
  pinMode(datchik3, INPUT);
  pinMode(datchik4, INPUT);
  pinMode(datchik5, INPUT);
  pinMode(datchik6, INPUT);
  pinMode(datchik7, INPUT);
  pinMode(rele, OUTPUT);
}

void loop(){
  if(digitalRead(rele) == LOW) muTimer = millis();

  if (digitalRead(datchik1) == HIGH){
    digitalWrite(rele, HIGH);
  }
  if (digitalRead(datchik2) == HIGH){
    digitalWrite(rele, HIGH);
  }
  if (digitalRead(datchik3) == HIGH){
    digitalWrite(rele, HIGH);
  }
  if (digitalRead(datchik4) == HIGH){
    digitalWrite(rele, HIGH);
  }
  if (digitalRead(datchik5) == HIGH){
    digitalWrite(rele, HIGH);
  }
  if (digitalRead(datchik6) == HIGH){
    digitalWrite(rele, HIGH);
  }
  if (digitalRead(datchik7) == HIGH){
    digitalWrite(rele, HIGH);
  }
  if(millis() - muTimer >= 5000)digitalWrite(rele, LOW);//Задержка 5 сек.
}

 

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

Seltvik пишет:

Да вы сломали мне мозг))) А как думаете может мою задачу можно и другим путем решить. 

Вот я об этом и говорю. Проблема новичков в программировании в наличии тараканов в голове. Вы видели дорогу с  множеством машин. Вот когда все соблюдают правила и не гоняют как шумахеры, то все успеют. Да шумахеры вроде и быстрее едут, но при аварии буквально перекрывают дорогу.  Да если у шумахер один на дороге это здорово. А вот если их несколько , то уже не здорово. Так и в программировании. Дернут где-то скечь, а то что  в скече есть циклы, задержки и delay()  прочие прелести , которые буквально конфликтуют с другими процессами, то потом воют.  Учитесь разводить процессы явно и не явно и все у вас получится.

ПС: Вот еще код можете размножить на 5-7 датчиков

/* генератор вспышек
светодиод -> 13 (Led_pin) 1 горит/ 0 нет
       GND ->  GND
*/
const int Led_pin = 13 ; // нога светодиода
uint8_t Led  ;
void setup() {
  pinMode(Led_pin, OUTPUT);
  digitalWrite(Led_pin, Led = 0);
}
void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 1000 миллисекунд вычислит. поток 1
  static uint32_t past_1 = 0 ;
  if (Led && MILLIS - past_1 >= 2000 ) {// 2000 миллесекунд=2сек длительность вспышеки
    digitalWrite(Led_pin, Led = 0);
  }
  if (MILLIS - past_1 >= 10000) { // 10000 миллесекунд=10сек период вспышек
    digitalWrite(Led_pin, Led = 1);
    past_1 = MILLIS ;
  }
}

 

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Извините меня конечно. Но я не совсем догнал как я смогу это применить к своему проекту в доме( Датчик работает так есть сигнал идет размыкание и МК включает свет мне в погребе на 5 мин и если в течении 5 мин есть снова движение он как бы продляет снова на 5 мин работу лампочки. И вот таких линий с датчиками 5 штук. И каждая должна включаться независимо. Скажите а на МК ардуино можно написать 5 разных процедур таймеров? Чтобы они как бы разные были и я мог бы в loop опрашивать датчики и запускать таймеры котоыре будут по окончанию отключать свет или снова его включать?

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

Seltvik, ответ на Ваш вопрос банален до невозможности.

Представьте, что не контроллер следит за датчиками и включает нагрузку, а Вы сами.

Т.е. перед Вами есть 5 индикаторов, за которыми нужно следить, 5 тумблеров, включающих нагрузку, одни часы, показывающие время, карандаш и лист бумаги, на котором можно делать рабочие записи. Подробно расскажите, что именно Вы будете делать, если стоит задача отслеживать датчики и после срабатывания каждого включать соответствующую нагрузку на 5 минут.

Как только Вы это напишете, Вам останется только перевести с русского на Си и получится готовый код, т.к. МК будет работать в точности по тому же алгоритму, что и Вы.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Т.е. ваш код например работает с одним реле там все просто)) я бы и сам написал такое)) А у меня и датчиков несколько и реле к каждому свое( Т.е. сработал первый датчик включил реле на 5 мин. пока это реле включенно увидел еще сигнал с датчика 2а включил второе реле на 5 мин первое так и держиться и время идет и т.д.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

ну вот смотрите я все объяснил уже))) Вот на си или делфе все просто. Можно сделать на каждый процедуру которая будет вызываться по дейсвтию. Т.е. по сигналу с датчика. Процедура 1 например будет включать нагрузку 1 на 5 мин потом выключать и все банально просто а возможности ардуино я не знаю. гугли вроде таймеры. Он там как я понял один только? так? т.е. отдельными процедурами такое можно разве сделать?

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Читал эту тему вроде похоже на мое но не уверен что будет работать как мне надо. Попробую сегодня забацать код. Вот тема если интересно http://arduino.ru/forum/programmirovanie/vklyuchenie-pina-na-opredelennoe-vremya

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

Seltvik пишет:

ну вот смотрите я все объяснил уже))) Вот на си или делфе все просто. Можно сделать на каждый процедуру которая будет вызываться по дейсвтию.

Здесь то же самое. Разница лишь в том, что в Дефи Вы выставляете "галочку" т Делфи вместо Вас анализирует, пора ли вызывать определенную процедуру или нет, а здесь это должен делать Ваш код. А так - все то же самое.

Цитата:
Т.е. по сигналу с датчика. Процедура 1 например будет включать нагрузку 1 на 5 мин потом выключать и все банально просто а возможности ардуино я не знаю. гугли вроде таймеры.

Какая Вас устроит погрешность? max(десятки_микросекунд, время_опроса_датчика) устроит? Тогда не нужны Вам таймеры, делайте все из loop().

Цитата:
Он там как я понял один только? так? т.е. отдельными процедурами такое можно разве сделать?

А Вы сами можете одновременно следить за 7-ю датчиками и управлять 7-ю тумблерами? Если Вас не 7 человек, а только один?

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

))) Извините но не понимаю до окнца суть. Я могу следить одновременно за 7ю индикаторами)) правда одновременно включать не могу. Но это и не нужно пусть будут задержки в милисекунды суть такова чтобы в итоге он включил и основной код работал и независил от того что там он уже включил. Т.е. включил реле 1 на 5 мин и дальше работает опрашивает если появилось движение в течении 5 мин то снова перезапустил таймер как бы. Но так будет и основной код работы с nRf24l01 и т.д. те.е у меня 5 помещений основных подвала чтобы не включать там свет бывает что и забываем выключать его)) чтобы это все делала автоматика. В каждом будет PIR датчик от сигнализации и светодиодный свет там везде он управляеться твердотелыми реле. Все уже собрано осталось написать скетч. Думал в ардуино так же просто как и в Си или делфи для меня))) оказалось не все я знаю))) И вот щас есть идеи но будет ли работать как я хочу не факт. Поэтому и спросил может есть какие то варианты реализации такой системы. Хочется меньше кода сделать и чтобы срабатывало так ка кнадо. Зашел человек в помещение МК включил ему свет на 5 мин, если он ушел следовательно после 5 мин он его отключит. Если было движение в течении 5 мин он с момента последнего движения будет запускать таймер поддержания света там. Вроде теперь ясно объяснил)) Вроде тривиальная задача)) Но как дуб сижу вот и думаю как лучше это на меге сделать(

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Вот нашел статью думаю она мне поможет. Щас главное сообразит ькак под себя сделать)) Кому интересно вот она http://arduino-diy.com/arduino-Ispolzuyem-funktsii-delay-i-millis-pravilno

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

Seltvik пишет:

я шарю в программировании на СИ и делфи

...

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

...

я пока знаю что в ардуино есть раздел void setup и void loop - который повторяеться каждую секунду допустим.

Даааа.... вот и выросло поколение "шарящих" ....

«Дай Бог, чтоб наши дети на обломках самовластья смогли хотя бы что-то написать»
(автора не знаю, но не моё)

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Все такие умники)) Капец)) Я в шоке. Программирование в чем то схоже, но синтаксис и набор команд и их вариации я не знаю, вот и просил направить. Я больше чем уверен у многих такое было и многие меня поймут так как программирование например на асемблере это одно, прогарммирование ООП это дургое , программирование Ардуино элементарное, но нужна база она у меня есть. А практики применения всех процедур и вариации у людей тут уже была я так думал и думаю. Так что и спросил. Но как говориться, походу поговорка: "За спрос не бьют" не про ВАС. Спасибо. буду тыркаться пока сам.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
Я не знаю какой у Вас датчик движения, но если покупной то они практически все включают нагрузку сами, БЕЗ КОНТРОЛЕРА, и время задержки на них регулируется. Но если очень хочется задействовать контролер, то все о чем Вы спрашивали - МОЖНО!!!
 
Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Я и так знаю что можно))) У них есть задержка до 3 мин а это маловато и + к тому же они работаю чуть не так. Т.е. есть движение они подали сигнал и он есть 3 мин допустим. А если пропал сразу сигнал тоже и следовательно лампа допустим выключилась и плевать он хотел на время последнего действия.)) Датчики не для света ПИр а для сигнализации с нормально замкнутыми контактами

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

Seltvik пишет:

Я в шоке. 

Я тоже. В Ардуино прграммируют на самом обыкновенном С или С++, кому как нравится. А когда человек "шарящий в С" называет loop и setup "разделами", у меня возникает желание напиться и повеситься. Только вот не могу решить что сначала сделать: напиться а потом повеситься, или наоборот.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Я так и думал, что будут тут умники. Спасибо Вам большое всем. Очень помогаете своими комментами)) Ну написал бы я по терминалогии функция, процедура что измениться? То что я учился в универе 20 лет назад. Да многое не помню но база есть. И че я только не писал. Поживете с мое думаю у вас тоже от отсутствия практики часть забудиться. Но спасибо, что вы поумничали и я привлек ваше внимание.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
Простите но Вы видимо не доконца прочитали инструкцию. Там есть переключатель, в одном положении он срабатывает и выключается через н-времени а в другом он сработает и будет включен - пока есть движение, хоть 1 час, и выключится только если нет движения через н-времени
Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Вот сделал то что надо мне щас буду размножать. Вроде работает на одном примере. 

const int Sens1 = 8;
const int Relay1 = 13;

unsigned long Relay1OnTime;
bool Relay1On;

void setup() {
pinMode(Relay1, OUTPUT);
pinMode(Sens1, INPUT);
Relay1On = false;
}

void loop(){
if (digitalRead(Sens1) == HIGH) {
digitalWrite(Relay1, HIGH);
Relay1On = true;
Relay1OnTime = millis();
}

if(Relay1On)
if(millis() - Relay1OnTime > 30000) {
digitalWrite(Relay1, LOW);
Relay1On = false;
}

}

Мгли просто написат ьвам копатьв сторону милс функции вот пример на ссылку и все. Вопрсо закрыт

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

ЕвгенийП, раслабтесь. Это такие программисты , за которых среда все делает.Программирование с помощью мыше-клика. А вот среда за них не делает, то и ничего у них не получится. Ни в СИ, не в ДЕЛФИ.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Извините но вы не поняли какие у меня датчики))) не такие. У меня профессиональные датчики для сигнализации 12В, которые фирму не скажу. теперь думаю вы поняли какие. Спасибо вам за подсказки и за то, что нашли время на переписку. Если что, как протестирую на нескольких датчиках отпишу сюда и код оставлю, а то мало ли кто еще ищет, а тут такие вон попадаются)) умные всякие))

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

А в 5# посте - там тоже для одного и на МИЛИС. Не смотрели?

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Да смотрел поэтмоу и начал гуглить эту тему про милс)) Просто недопетрел сразу про милс.

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

Seltvik пишет:

Мгли просто написат ьвам копатьв сторону милс функции вот пример на ссылку и все. Вопрсо закрыт

Вот мой код #6. Он такой же, но там опроса датчика нет. Если я поставил бы, то это почти как написать за вас.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Ваш код сложный лишнего много)) вот ваш:

/* генератор вспышек
светодиод -> 13 (Led_pin) 1 горит/ 0 нет
       GND ->  GND
*/
const int Led_pin = 13 ; // нога светодиода
uint8_t Led  ;
void setup() {
  pinMode(Led_pin, OUTPUT);
  digitalWrite(Led_pin, Led = 0);
}
void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 1000 миллисекунд вычислит. поток 1
  static uint32_t past_1 = 0 ;
  if (Led && MILLIS - past_1 >= 2000 ) {// 2000 миллесекунд=2сек длительность вспышеки
    digitalWrite(Led_pin, Led = 0);
  }
  if (MILLIS - past_1 >= 10000) { // 10000 миллесекунд=10сек период вспышек
    digitalWrite(Led_pin, Led = 1);
    past_1 = MILLIS ;
  }
}

Вот мой: 

const int Sens1 = 8;
const int Relay1 = 13;

unsigned long Relay1OnTime;
bool Relay1On;

void setup() {
pinMode(Relay1, OUTPUT);
pinMode(Sens1, INPUT);
Relay1On = false;
}

void loop(){
if (digitalRead(Sens1) == HIGH) {
digitalWrite(Relay1, HIGH);
Relay1On = true;
Relay1OnTime = millis();
}

if(Relay1On)
if(millis() - Relay1OnTime > 30000) {
digitalWrite(Relay1, LOW);
Relay1On = false;
}

}

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

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Т.е. я понял что в ардуино не обязательно использовать потоки и т.д. чтобы это хреньсделать. Есть великолепная функция милс) Позже выложу весь код если кому то мало ли пригодиться.

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

Seltvik пишет:

Ну написал бы я по терминалогии функция, процедура что измениться? 

Абсолютно ничего. Если бы Вы так написали, Вы показали бы свою безграмотность, но Вы её и так уже показали настолько, что добавить нечего.

Seltvik пишет:

 я учился в универе 

Потребуйте обратно деньги за обучение.

Seltvik пишет:

но база есть

Это заметно.

Seltvik пишет:

Поживете с мое 

Сиё невозможно. Разве что внуки мои.

 

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

удмаю что вы брешите. так как взрослый человек с багажом знаний и нормальной совестью. Не будет давать такие комментарии + цепляться к словам. Думаю либо вы обманываете и вы юноша, а если и врозлый, думаю Вас чем то жизнь обидела настолько, что вы свои негатив выплескиваете здесь на форуме. Я таких видел и не раз. В любом раскладе мне Вас жаль. Но вы сделали мой день. Спасибо)))) И спасибо тем кто здесь на форуме чтобы направлять и помогать. независимо от несуразных слов и выражений, а не для того чтобы преследовать цель кого то затролить или поумничать. А самое интересно что вы находите время и пишите и редактите комент с цитатами, тратите время. Думаю правда Вас чем то жизнь обидела)) или вы просто такой человек. Я вас не виню)) есть такие. Все мы разные. Спасибо

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

Seltvik пишет:

 или вы просто такой человек. 

Да, я просто такой человек. Когда я слышу, что человек "шарит" в С и при том не может на этом самом С три датчика опросить, .... ну, вот такой я человек.

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

Ну если бы я выложил этот . Вы бы в нем разобрались. Да вы бы на него тупо забили бы. Ну и зачем мне корячится.

/*
#1
датчик ->2 (Sens1_pin) 1 сработал / 0 нет
реле   ->8 (Relay1_pin) 1 вкл / 0 нет
#2
датчик ->3 (Sens2_pin) 1 сработал / 0 нет
реле   ->9 (Relay2_pin) 1 вкл / 0 нет
#3
датчик ->4 (Sens3_pin) 1 сработал / 0 нет
реле   ->10 (Relay3_pin) 1 вкл / 0 нет
#4
датчик ->5 (Sens4_pin) 1 сработал / 0 нет
реле   ->11 (Relay4_pin) 1 вкл / 0 нет
#5
датчик ->6 (Sens5_pin) 1 сработал / 0 нет
реле   ->12 (Relay5_pin) 1 вкл / 0 нет
*/
//#1
const int Sens1_pin = 2;
const int Relay1_pin = 8;
bool Relay1;
//#2
const int Sens2_pin = 3;
const int Relay2_pin = 9;
bool Relay2;
//#3
const int Sens3_pin = 4;
const int Relay3_pin = 10;
bool Relay3;
//#4
const int Sens4_pin = 5;
const int Relay4_pin = 11;
bool Relay4;
//#5
const int Sens5_pin = 6;
const int Relay5_pin = 12;
bool Relay5;

void setup() {
  // #1
  pinMode(Sens1_pin, INPUT);
  pinMode(Relay1_pin, OUTPUT);
  digitalWrite(Relay1_pin, Relay1 = 0);
  // #2
  pinMode(Sens2_pin, INPUT);
  pinMode(Relay2_pin, OUTPUT);
  digitalWrite(Relay2_pin, Relay2 = 0);
  // #3
  pinMode(Sens3_pin, INPUT);
  pinMode(Relay3_pin, OUTPUT);
  digitalWrite(Relay3_pin, Relay3 = 0);
  // #4
  pinMode(Sens4_pin, INPUT);
  pinMode(Relay4_pin, OUTPUT);
  digitalWrite(Relay4_pin, Relay4 = 0);
  // #5
  pinMode(Sens5_pin, INPUT); // подключить датчик
  pinMode(Relay5_pin, OUTPUT); // подключить реле
  digitalWrite(Relay1_pin, Relay5 = 0);// выкл реле
}

void loop() {
  // #1
  static uint32_t Relay1Time = 0;
  if (Relay1 && millis() - Relay1Time > 30000)
    digitalWrite(Relay1_pin, Relay1 = 0);
  if (digitalRead(Sens1_pin)) {
    digitalWrite(Relay1_pin, Relay1 = 1);
    Relay1Time = millis();
  }
  // #2
  static uint32_t Relay2Time = 0;
  if (Relay2 && millis() - Relay2Time > 30000)
    digitalWrite(Relay2_pin, Relay2 = 0);
  if (digitalRead(Sens2_pin)) {
    digitalWrite(Relay2_pin, Relay2 = 1);
    Relay2Time = millis();
  }
  // #3
  static uint32_t Relay3Time = 0;
  if (Relay3 && millis() - Relay3Time > 30000)
    digitalWrite(Relay3_pin, Relay3 = 0);
  if (digitalRead(Sens3_pin)) {
    digitalWrite(Relay3_pin, Relay3 = 1);
    Relay3Time = millis();
  }
  // #4
  static uint32_t Relay4Time = 0;
  if (Relay4 && millis() - Relay4Time > 30000)
    digitalWrite(Relay4_pin, Relay4 = 0);
  if (digitalRead(Sens4_pin)) {
    digitalWrite(Relay4_pin, Relay4 = 1);
    Relay4Time = millis();
  }
  // #5
  static uint32_t Relay5Time = 0; // таймер
  if (Relay5 && millis() - Relay5Time > 30000) // если прошло 30 сек
    digitalWrite(Relay5_pin, Relay5 = 0);// выключить реле
  if (digitalRead(Sens5_pin)) { // если датчик сработал
    digitalWrite(Relay5_pin, Relay5 = 1);// вкл реле
    Relay5Time = millis();// и выставить время выкл
  }
}

Вот я не лез с ним.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Так я и не просил дат ьмне код сразу)) Я просил навести меня так как я не люблю все готовое. Ибо мне с этим работать и править еще. Следовательно надо разбираться самому) Спасибо еще раз. Мир не без добрых людей) Ну и с разынми обиженными, не без этого)

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

И да вы Си и язык ардуино похоже но не совсем одно и то же. Там проще в плане ООП и функционала больше чем тут тут все проще согласен, но надо иметь базу, практику работы с МК. Так как есть свои особенности. Но все же спасибо что потратили время но очень важные комментарии. Особенно с цитатами) Тут в каждом посте такие от вас поди)) Кстати вот далеко ходить не надо читал тут тему про милс  там тоже Вы : http://arduino.ru/forum/programmirovanie/vklyuchenie-pina-na-opredelennoe-vremya Выливаете снова свою философию и негатив пост 28 так мимо дела)) Много лишнего и от Вас. Вы тартите свое время на такие вещи)) Будьте проще и к людям отностиесь проще. Не все же отцы ардуино или просто очень умные)) Сюда люди идут в первую очередь за советом от знающих. И да не все могут правильно подать мысль или грамотно написать. Как я и сказал все мы разные))

nik182
Offline
Зарегистрирован: 04.05.2015

Язык ардуины это чистый C++ к которому добрые разработчики добавили несколько собственных функций для упрощения програмирования чайниками и спятали функцию main(); 

Вы можете написать всю программу на чистом Си или на С++, без единой функции ардуино и среда это скушает и успешно прошьёт контроллер и программа будет работать. И даже не использовать loop() и setup(); Среда на компиляцию запускает файл c:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp и то что вы написали. Посмотрите. Это для общего развития, что бы понимать как сроится проект на ардуино.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

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

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

Seltvik пишет:

И да вы Си и язык ардуино похоже но не совсем одно и то же. 

Вам же уже говорили, что в Ардуино используется С и С++, а Вы опять за своё ... В чём Ваша проблема? Хотите помощи - Вам помогают, объясняют, Вы же упираетесь рогом. Зачем?

Прям как у Зиновьева: "Ибанов - это литературный псевдоним; настоящая его фамилия - Ибанов". Так и Вы "это только похоже на С, а на самом деле там С".

Если Вы пришли сюда

Seltvik пишет:

за советом от знающих

так слушайте, что Вам говорят и учитесь. И вообще

Seltvik пишет:

 Будьте проще 

 

 

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

qwone пишет:

ЕвгенийП, раслабтесь. Это такие программисты , за которых среда все делает.Программирование с помощью мыше-клика. А вот среда за них не делает, то и ничего у них не получится. Ни в СИ, не в ДЕЛФИ.

Так я про то и говорю, что "выросло поколение"....

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

ЕвгенийП пишет:

Seltvik пишет:

я шарю в программировании на СИ и делфи

...

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

...

я пока знаю что в ардуино есть раздел void setup и void loop - который повторяеться каждую секунду допустим.

Даааа.... вот и выросло поколение "шарящих" ....

«Дай Бог, чтоб наши дети на обломках самовластья смогли хотя бы что-то написать»
(автора не знаю, но не моё)

Вот ваш первый коммент. Это так вы помогаете? Цитатами? Да есть люди которые тут реально помогают. Подсказывают. Но думаю это не вы. Покрайне мере вы ничего такого не написали кроме замечаний и выражений чтобы задеть чтоли))) Если Вас кто то в жизни обидел очень. Отпустите это. будьте реально проще к себе и другим. Хорошего дня.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

ЕвгенийП пишет:

qwone пишет:

ЕвгенийП, раслабтесь. Это такие программисты , за которых среда все делает.Программирование с помощью мыше-клика. А вот среда за них не делает, то и ничего у них не получится. Ни в СИ, не в ДЕЛФИ.

Так я про то и говорю, что "выросло поколение"....

Вот показатель вашего уровня))) Вы даже не знаете сколько человеку лет и пишите про поколение))) Занете в жизни важно какой вы человек а не какой вы программист или юрист. А элементарный показатель морали и человечности это поступки. Но вы этого не знаете или забыли)

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

А это для тех , кто занимается ООП. Тот же самый код , но в классе. Замечание: компилировал, но в систему не заливал, так как нету ;)

/*
#1
датчик ->2 (Sens1_pin) 1 сработал / 0 нет
реле   ->8 (Relay1_pin) 1 вкл / 0 нет
#2
датчик ->3 (Sens2_pin) 1 сработал / 0 нет
реле   ->9 (Relay2_pin) 1 вкл / 0 нет
#3
датчик ->4 (Sens3_pin) 1 сработал / 0 нет
реле   ->10 (Relay3_pin) 1 вкл / 0 нет
#4
датчик ->5 (Sens4_pin) 1 сработал / 0 нет
реле   ->11 (Relay4_pin) 1 вкл / 0 нет
#5
датчик ->6 (Sens5_pin) 1 сработал / 0 нет
реле   ->12 (Relay5_pin) 1 вкл / 0 нет
*/
class Sens_Relay {
  public:
    Sens_Relay(int Sens_pin, int Relay_pin);
    void in_setup();
    void in_loop();
  private:
    int _Sens_pin;
    int _Relay_pin;
    bool _Relay;
    uint32_t _RelayTime;
};
Sens_Relay::Sens_Relay(int Sens_pin, int Relay_pin ) {
  _Sens_pin = Sens_pin;
  _Relay_pin = Relay_pin;
}
void Sens_Relay::in_setup()  {
  pinMode(_Sens_pin, INPUT);// подключить датчик
  pinMode(_Relay_pin, OUTPUT); // подключить реле
  digitalWrite(_Relay_pin, _Relay = 0);// выкл реле
  _RelayTime = millis();// и выставить время выкл
}
void Sens_Relay::in_loop() {
  if (_Relay && millis() - _RelayTime > 30000) // если прошло 30 сек
    digitalWrite(_Relay_pin, _Relay = 0);// выключить реле
  if (digitalRead(_Sens_pin)) {// если датчик сработал
    digitalWrite(_Relay_pin, _Relay = 1);// вкл реле
    _RelayTime = millis();// и выставить время выкл
  }
}


//#1
const int Sens1_pin = 2;
const int Relay1_pin = 8;
Sens_Relay Sens_Relay1(Sens1_pin, Relay1_pin);
//#2
const int Sens2_pin = 3;
const int Relay2_pin = 9;
Sens_Relay Sens_Relay2(Sens2_pin, Relay2_pin);
//#3
const int Sens3_pin = 4;
const int Relay3_pin = 10;
Sens_Relay Sens_Relay3(Sens3_pin, Relay3_pin);
//#4
const int Sens4_pin = 5;
const int Relay4_pin = 11;
Sens_Relay Sens_Relay4(Sens4_pin, Relay4_pin);
//#5
const int Sens5_pin = 6;
const int Relay5_pin = 12;
Sens_Relay Sens_Relay5(Sens5_pin, Relay5_pin);

void setup() {
  // #1
  Sens_Relay1.in_setup();
  // #2
  Sens_Relay2.in_setup();
  // #3
  Sens_Relay3.in_setup();
  // #4
  Sens_Relay4.in_setup();
  // #5
  Sens_Relay5.in_setup();
}

void loop() {
  // #1
  Sens_Relay1.in_loop();
  // #2
  Sens_Relay2.in_loop();
  // #3
  Sens_Relay3.in_loop();
  // #4
  Sens_Relay4.in_loop();
  // #5
  Sens_Relay5.in_loop();
}

 

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

Seltvik пишет:

Вот ваш первый коммент. Это так вы помогаете?

А другие комменты Вы не читали? например №19

ЕвгенийП пишет:

В Ардуино прграммируют на самом обыкновенном С или С++, кому как нравится. 

Видимо, нет, т.к. через час после этого Вы несёте бред

Seltvik пишет:

Си и язык ардуино похоже но не совсем одно и то же. Там проще в плане ООП и функционала больше чем тут тут все проще 

Впрочем, мне пофигу, я знаю на чём программирую в Ардуино и у меня нет проблемы опросить три датчика. Проблема у Вас, а не у меня. Так что дело Ваше: слушать, что Вам люди говорят или огрызаться.

Только, пожалуйста, не говорите, что Вы "шарите в С". Взбесило именно это. Не будь такого заявления, тон ответов был бы другим. А то, блин ... шарите (и ещё циатата) "а сами зубного порошку наелись третьего дня".

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

ЕвгенийП пишет:

Seltvik пишет:

Вот ваш первый коммент. Это так вы помогаете?

А другие комменты Вы не читали? например №19

ЕвгенийП пишет:

В Ардуино прграммируют на самом обыкновенном С или С++, кому как нравится. 

Видимо, нет, т.к. через час после этого Вы несёте бред

Seltvik пишет:

Си и язык ардуино похоже но не совсем одно и то же. Там проще в плане ООП и функционала больше чем тут тут все проще 

Впрочем, мне пофигу, я знаю на чём программирую в Ардуино и у меня нет проблемы опросить три датчика. Проблема у Вас, а не у меня. Так что дело Ваше: слушать, что Вам люди говорят или огрызаться.

Только, пожалуйста, не говорите, что Вы "шарите в С". Взбесило именно это. Не будь такого заявления, тон ответов был бы другим. А то, блин ... шарите (и ещё циатата) "а сами зубного порошку наелись третьего дня".

 

Вы просто нереально сделали мой ДЕНЬ. Причем тут 19 пост ахахаха. Вы с чего начали, я Вам то и показал. Знаете это как ваша логика. Что первое прочитали вы в начале поста и сделали какой то свой вывод. Вы как уж на сковородке))) Знаете поговорку. Встречают по одежке. Вот, что человек должен думать если Вы сразу начинаете с такого поста как первый? И потом уже не важно какой 19 пост или 30 след от Вас. Все одно. Вы в каждой ветке находите момент чтобы просто облить человека. Вы думаю в реальной жини, даже если и реально взрослый человек, просто несчастный и обиженный)) Но не расстраивайтесь. Все будет хорошо. Люди в ваших тараканах не виноваты и поверьте таким как я ваши комменты "не о чем" не нужны. ЗНАЕТЕ как говорят: Проходите мимо. И да по вашим словам, не похоже что Вам за 40)) думаю вы юноша у которого просто в жизни, что то плохо слишком. Что вас бесят посты и заставлют писать грязь или просто "умничать")) Может Вам сходить к кому нить?) Шучу. Всем спамибо еще раз.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

qwone пишет:

А это для тех , кто занимается ООП. Тот же самый код , но в классе. Замечание: компилировал, но в систему не заливал, так как нету ;)

/*
#1
датчик ->2 (Sens1_pin) 1 сработал / 0 нет
реле   ->8 (Relay1_pin) 1 вкл / 0 нет
#2
датчик ->3 (Sens2_pin) 1 сработал / 0 нет
реле   ->9 (Relay2_pin) 1 вкл / 0 нет
#3
датчик ->4 (Sens3_pin) 1 сработал / 0 нет
реле   ->10 (Relay3_pin) 1 вкл / 0 нет
#4
датчик ->5 (Sens4_pin) 1 сработал / 0 нет
реле   ->11 (Relay4_pin) 1 вкл / 0 нет
#5
датчик ->6 (Sens5_pin) 1 сработал / 0 нет
реле   ->12 (Relay5_pin) 1 вкл / 0 нет
*/
class Sens_Relay {
  public:
    Sens_Relay(int Sens_pin, int Relay_pin);
    void in_setup();
    void in_loop();
  private:
    int _Sens_pin;
    int _Relay_pin;
    bool _Relay;
    uint32_t _RelayTime;
};
Sens_Relay::Sens_Relay(int Sens_pin, int Relay_pin ) {
  _Sens_pin = Sens_pin;
  _Relay_pin = Relay_pin;
}
void Sens_Relay::in_setup()  {
  pinMode(_Sens_pin, INPUT);// подключить датчик
  pinMode(_Relay_pin, OUTPUT); // подключить реле
  digitalWrite(_Relay_pin, _Relay = 0);// выкл реле
  _RelayTime = millis();// и выставить время выкл
}
void Sens_Relay::in_loop() {
  if (_Relay && millis() - _RelayTime > 30000) // если прошло 30 сек
    digitalWrite(_Relay_pin, _Relay = 0);// выключить реле
  if (digitalRead(_Sens_pin)) {// если датчик сработал
    digitalWrite(_Relay_pin, _Relay = 1);// вкл реле
    _RelayTime = millis();// и выставить время выкл
  }
}


//#1
const int Sens1_pin = 2;
const int Relay1_pin = 8;
Sens_Relay Sens_Relay1(Sens1_pin, Relay1_pin);
//#2
const int Sens2_pin = 3;
const int Relay2_pin = 9;
Sens_Relay Sens_Relay2(Sens2_pin, Relay2_pin);
//#3
const int Sens3_pin = 4;
const int Relay3_pin = 10;
Sens_Relay Sens_Relay3(Sens3_pin, Relay3_pin);
//#4
const int Sens4_pin = 5;
const int Relay4_pin = 11;
Sens_Relay Sens_Relay4(Sens4_pin, Relay4_pin);
//#5
const int Sens5_pin = 6;
const int Relay5_pin = 12;
Sens_Relay Sens_Relay5(Sens5_pin, Relay5_pin);

void setup() {
  // #1
  Sens_Relay1.in_setup();
  // #2
  Sens_Relay2.in_setup();
  // #3
  Sens_Relay3.in_setup();
  // #4
  Sens_Relay4.in_setup();
  // #5
  Sens_Relay5.in_setup();
}

void loop() {
  // #1
  Sens_Relay1.in_loop();
  // #2
  Sens_Relay2.in_loop();
  // #3
  Sens_Relay3.in_loop();
  // #4
  Sens_Relay4.in_loop();
  // #5
  Sens_Relay5.in_loop();
}

 

Очень похоже)) спасибо. Но я уже разобрался. не без вашей помощи))) Да сначала так проще как в ООП пишишь функции вначале или процедуры а потом вызываешь их можно кучу отдельных таймеров кинуть. И да синтаксис похож я уже начинаю улавливать суть работы с МК))

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

Seltvik пишет:

Вы просто нереально сделали мой ДЕНЬ. 

Я рад за Вас.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:

Даааа.... вот и выросло поколение "шарящих" ....

«Дай Бог, чтоб наши дети на обломках самовластья смогли хотя бы что-то написать»
(автора не знаю, но не моё)

Да, здесь хватает таких "шарящих", не бери в голову, пусть дальше шарит.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

ЕвгенийП пишет:

Seltvik пишет:

Вы просто нереально сделали мой ДЕНЬ. 

Я рад за Вас.

Спс я шутил конечно)) Я согласился же с Вами, что я не так выразился и т.д. Ну дубоват я стал. Но ненадо так к людям. Они сюда не за мнением о себе приходят. А за помощью. не хотите помочь советом не надо)) Вас же не заставляют. А грязь лить много ума не надо или умничать)) Хорошего дня.

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Ворота пишет:

ЕвгенийП пишет:

Даааа.... вот и выросло поколение "шарящих" ....

«Дай Бог, чтоб наши дети на обломках самовластья смогли хотя бы что-то написать»
(автора не знаю, но не моё)

Да, здесь хватает таких "шарящих", не бери в голову, пусть дальше шарит.

Вам стало легче?)))Надеюсь что да. Еще один очень важный комментарий)) Я даже и не думал, что среди любителей и специалистов по Ардуино здесь так много "СЛИШКОМ" умных))

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

Видите ли, Seltvik, для того, чтобы наставить человека на путь истинный, его нужно пнуть в нужном направлении. Иногда сильно пнуть. Иногда неоднократно. Т.к. некоторые, испытав на себе пинок, обижаются и вместо того, чтобы следовать в указанном направлении (возможно, назло, а возможно, просто по глупости) пытаются двигаться в прямо противоположном. И нередко потом, даже осознав верно направление, столько перед этим наплутают, что уже и не видно, что в нужном направлении их пинали с самого начала.