Контроллер освещения

Djsdrum
Offline
Зарегистрирован: 20.10.2016

Всем привет, хочу сделать контроллер освещения на 5 каналов, но что-то не так со скетчем. Поэтому уважаемые форумчане помогите оптимизировать код. Использую ардуину уно, датчики движения HC-SR501 5 шт. , и 5 реле. Программировать начал совсем недавно (начинающий), и многого еще не понимаю. Я так понимаю проблему можно решить с помощью прерываний, но как их применить увы не знаю. Вот разработанный скетч: 

  void setup() 
{
  pinMode(2, INPUT);    //PIR 1 
  pinMode(3, INPUT);    //PIR 2 
  pinMode(4, INPUT);    //PIR 3 
  pinMode(5, INPUT);    //PIR 4 
  pinMode(6, INPUT);    //PIR 5 
  pinMode(7, OUTPUT);   //relay 1
  pinMode(8, OUTPUT);   //relay 2
  pinMode(9, OUTPUT);   //relay 3
  pinMode(10, OUTPUT);  //relay 4
  pinMode(11, OUTPUT);  //relay 5
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
}
  void loop()
{
  if (digitalRead(2) == HIGH) // время с начала срабатывания PIR 1
    delay (1000);  
  if (digitalRead(3) == HIGH) // время с начала срабатывания PIR 1
    delay (1000);
  if (digitalRead(4) == HIGH) // время с начала срабатывания PIR 1
    delay (1000);
  if (digitalRead(5) == HIGH) // время с начала срабатывания PIR 1
    delay (1000);
  if (digitalRead(6) == HIGH) // время с начала срабатывания PIR 1
  
      {
  digitalWrite(7, HIGH); // включено реле 1
  delay (30000);
  digitalWrite(8, HIGH); // включено реле 1
  delay (30000);
  digitalWrite(9, HIGH); // включено реле 1
  delay (30000);
  digitalWrite(10, HIGH); // включено реле 1
  delay (30000);
  digitalWrite(11, HIGH); // включено реле 1
  delay (30000);
}
else
  digitalWrite(7, LOW); // иначе не включено реле 1 
  digitalWrite(8, LOW); // иначе не включено реле 1 
  digitalWrite(9, LOW); // иначе не включено реле 1 
  digitalWrite(10, LOW); // иначе не включено реле 1 
  digitalWrite(11, LOW); // иначе не включено реле 1
  }
Djsdrum
Offline
Зарегистрирован: 20.10.2016

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

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

Так можно и без ардуины. http://www.youtube.com/watch?v=ajG6P9AR3Io

Djsdrum
Offline
Зарегистрирован: 20.10.2016

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

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Djsdrum пишет:

От чего ощущение, что контроллер тормозит. Подскажите, что можно сделать в этой ситуации???

удалить делеи.

Djsdrum
Offline
Зарегистрирован: 20.10.2016

Без них пробывал тоже, но все равно проблема осталась. Собираю схему, а она не работает как надо, при этом компилятор не ругается на ошибки в коде.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Djsdrum пишет:

Без них пробывал тоже, но все равно проблема осталась. Собираю схему, а она не работает как надо, при этом компилятор не ругается на ошибки в коде.

как ты мне предлагаешь узнать о сути твоей проблемы?

какого рода методы дознания в отношении тебя предпринять?

Djsdrum
Offline
Зарегистрирован: 20.10.2016

Клапауций 232 пишет:

Djsdrum пишет:

Без них пробывал тоже, но все равно проблема осталась. Собираю схему, а она не работает как надо, при этом компилятор не ругается на ошибки в коде.

как ты мне предлагаешь узнать о сути твоей проблемы?

какого рода методы дознания в отношении тебя предпринять?

Просто объясните как прикрутить к данному коду прерывания?

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

Можно и без прерываний применять.

/* 
#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 future1 = 0 ;
  if (MILLIS>=future1) {
  future1 = MILLIS + 1000 ;
  // сам код
  MILLIS = millis() ;    
  }
//#2  200 миллисекунд вычислит. поток 2
  static uint32_t future2 = 0 ;
  if (MILLIS>=future2) {
  future2 = MILLIS + 200 ;
  // сам код
  MILLIS = millis() ;    
  }
//#3  100 миллисекунд вычислит. поток 3
  static uint32_t future3 = 0 ;
  if (MILLIS>=future3) {
  future3 = MILLIS + 100 ;  
    // сам код  
  }
}

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Djsdrum пишет:

Клапауций 232 пишет:

Djsdrum пишет:

Без них пробывал тоже, но все равно проблема осталась. Собираю схему, а она не работает как надо, при этом компилятор не ругается на ошибки в коде.

как ты мне предлагаешь узнать о сути твоей проблемы?

какого рода методы дознания в отношении тебя предпринять?

Просто объясните как прикрутить к данному коду прерывания?

ок. ходи голодный, если не желаешь сотрудничать.

Djsdrum
Offline
Зарегистрирован: 20.10.2016

Клапауций 232 пишет:

Djsdrum пишет:

Клапауций 232 пишет:

Djsdrum пишет:

Без них пробывал тоже, но все равно проблема осталась. Собираю схему, а она не работает как надо, при этом компилятор не ругается на ошибки в коде.

как ты мне предлагаешь узнать о сути твоей проблемы?

какого рода методы дознания в отношении тебя предпринять?

Просто объясните как прикрутить к данному коду прерывания?

ок. ходи голодный, если не желаешь сотрудничать.

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

void setup()

{

  pinMode(2, INPUT);    //PIR 1

  pinMode(7, OUTPUT);   //relay 1

  digitalWrite(2, LOW);

}

  void loop()

{

  if (digitalRead(2) == HIGH) // время с начала срабатывания PIR 1

      {

  digitalWrite(7, HIGH); // включено реле 1

}

else

      digitalWrite(7, LOW); // если не было движения, то выключено реле 1

    }

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

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

прошло 5 дней (по словам автора уже месяц), а от автора так и не поступило алгоритма КАК это должно работать.

Получили срабатывание сенсора 1 - что делаем дальше? И т.д.

Djsdrum
Offline
Зарегистрирован: 20.10.2016

Tomasina пишет:

прошло 5 дней (по словам автора уже месяц), а от автора так и не поступило алгоритма КАК это должно работать.

Получили срабатывание сенсора 1 - что делаем дальше? И т.д.

Месяц прошел с того времени как я начал работать над контроллером освещения. Алгоритм простой. Когда срабатывает датчик движения, не важно какой из пяти каналов, то срабатывает реле назначенное на данный канал и включает освещение на одну минуту. После сработки датчика если не было движения, освещение выключается. Затем процесс повторяется.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Djsdrum пишет:
Месяц прошел с того времени как я начал работать над контроллером освещения.
Надо полагать с программированием ты знаком и того меньше...

Алгоритм действительно простой:

void loop()
{
 for(i=0; i<NUM; i++)
 {
  if(PirSensorOn(i)) TurnRelayOn(i);
  if(IsTimerExpired(i)) TurnRelayOff(i);
 }
}

Что-то мне подсказывает, что это не решает твоих проблем, а только создает новые.

Djsdrum
Offline
Зарегистрирован: 20.10.2016

qwone пишет:

Можно и без прерываний применять.

/* 
#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 future1 = 0 ;
  if (MILLIS>=future1) {
  future1 = MILLIS + 1000 ;
  // сам код
  MILLIS = millis() ;    
  }
//#2  200 миллисекунд вычислит. поток 2
  static uint32_t future2 = 0 ;
  if (MILLIS>=future2) {
  future2 = MILLIS + 200 ;
  // сам код
  MILLIS = millis() ;    
  }
//#3  100 миллисекунд вычислит. поток 3
  static uint32_t future3 = 0 ;
  if (MILLIS>=future3) {
  future3 = MILLIS + 100 ;  
    // сам код  
  }
}

 

Собрал по вашему варианту тоже не работает

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Все верно, его вариант нерабочий по-определению.

Djsdrum
Offline
Зарегистрирован: 20.10.2016

Andy пишет:

Все верно, его вариант нерабочий по-определению.

Уважаемый Andy, доброго времени суток. Ваш код по логике вещей наиболее работоспособен из предложенных. Но, немного не пойму как его прикрутить, чтобы в итоге все пины ардуины уно были задействованы и отрабатывали с задержкой не более секунды. То есть произошло событие, сработали датчики движения в пяти комнатах скажем так одновременно и на каждую комнату включилось реле, которое в свою очередь включило освещение. Как начать setup?

Djsdrum
Offline
Зарегистрирован: 20.10.2016

Всем спасибо за помощь,  я смог самостоятельно разобраться. Написал код и протестил, все работает как надо.