Управление набором ламп освещения

vasya00
Offline
Зарегистрирован: 30.05.2016

Здравствуйте, задумка такая: есть десяток PIR датчиков HC-SR501, и десяток выключателей освещения, нужно все это совместить с помощью Arduino, и вести учет. Вопрос в том как красивее это реализовать. Пока представление следующее, написать функцию переключение выключателя освещения, она будет выглядить так:

void lampswitch (byte lampnumber)
{
  digitalWrite(lampnumber,HIGH);
  delay(300);
  digitalWrite(lampnumber,LOW);
}

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

Спасибо!

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

vasya00 пишет:
в качестве параметра передавать ей номер лампы.

Странно но у вас в коде я вижу что нужно передавать номер пина.

vasya00 пишет:
Осталось только выяснить какой из десятка латчиков сработал, и передать его номер этой функции.

Очень сомневаюсь что это чем то поможет в реализации задачи.

vasya00 пишет:
Можно конечно опрашивать все десять последовательно

Можно вообще ничего не опрашивать и ничего работать не будет

vasya00 пишет:
Но может есть более короткое и красивое решение?

Делаем быстро качественно и недорого.... выбирайте 2....

Решение или красивое с точки зрения кода или затрат ресурсов? Короткое? опять тот же вопрос, короткое по коду или по ресурсам?.

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

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

 

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

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

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

А какой смысл включать лампу на 300мс, а потом выключать?

И делать это раз в три секунды?

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

vasya00 пишет:
. Вопрос в том как красивее это реализовать. 

..

Но может есть более короткое и красивое решение?

Красота это понятие индивидуальное.

/**/
unsigned long mill;
typedef void (*pDo)();
//--------------------------------------
// класс лампы
class Cl_Lamp {
  protected:
    byte pin;
  public:
    Cl_Lamp(byte p): pin(p) {}
    void init() {}
    void run() {}
    void flash() {}
};
//--------------------------------------
// класс сенсор HC-SR501
class Cl_HC_SR501 {
  protected:
    byte pin;
    pDo Do;
  public:
    Cl_HC_SR501(byte p, pDo D): pin(p), Do(D) {}
    void init() {}
    void run() {}
};
//-------Компоновка-------------------------------
Cl_Lamp Lamp1(/*пин*/2);
Cl_Lamp Lamp2(/*пин*/3);
Cl_Lamp Lamp3(/*пин*/4);
Cl_Lamp Lamp4(/*пин*/5);
Cl_Lamp Lamp5(/*пин*/6);
void DoSens1() {
  Lamp1.flash();
};
void DoSens2() {
  Lamp2.flash();
};
void DoSens3() {
  Lamp3.flash();
};
void DoSens4() {
  Lamp4.flash();
};
void DoSens5() {
  Lamp5.flash();
};
Cl_HC_SR501 Sens1(/*пин*/7,/*обработчик*/DoSens1);
Cl_HC_SR501 Sens2(/*пин*/8,/*обработчик*/DoSens2);
Cl_HC_SR501 Sens3(/*пин*/9,/*обработчик*/DoSens3);
Cl_HC_SR501 Sens4(/*пин*/10,/*обработчик*/DoSens4);
Cl_HC_SR501 Sens5(/*пин*/11,/*обработчик*/DoSens5);
//-------main()-------------------------------
void setup() {
  Lamp1.init();
  Lamp2.init();
  Lamp3.init();
  Lamp4.init();
  Lamp5.init();
  Sens1.init();
  Sens2.init();
  Sens3.init();
  Sens4.init();
  Sens5.init();
}
void loop() {
  mill = millis();
  Lamp1.run();
  Lamp2.run();
  Lamp3.run();
  Lamp4.run();
  Lamp5.run();
  Sens1.run();
  Sens2.run();
  Sens3.run();
  Sens4.run();
  Sens5.run();
}
/*Скетч использует 640 байт (2%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 33 байт (1%) динамической памяти, оставляя 2015 байт для локальных переменных. Максимум: 2048 байт.
*/

 

vasya00
Offline
Зарегистрирован: 30.05.2016

Там выключатель который управляется импульсом 300 мс, раз в три секунды не нужно.

Подскажите, пожалуйста хорошее ли решение: прерыванием по таймеру каждые 100 мс, считывать состояния пинов с подключенными PIR датчиками, в цикле от 1 до 10 по количеству датчиков, в случае если на пине HIGH, выполнить функцию lampswitch с параметром номера прохода цикла. Будет ли успевать Arduino  за 100  мс считать состояния 10 пинов в цикле?

Спасибо!

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

vasya00 пишет:

прерыванием по таймеру каждые 100 мс, считывать состояния пинов с подключенными PIR датчиками, в цикле от 1 до 10 по количеству датчиков, в случае если на пине HIGH, выполнить функцию lampswitch с параметром номера прохода цикла.

Ну, как бы, считываем каждые 100мс. Время выполнения функции lampswitch - 300+ мс. Возможно, придётся выполнить до 10 таких функций.

Вот и думайте

vasya00 пишет:

Будет ли успевать Arduino  за 100  мс 

выполнить 1-10 функций по 300мс каждая?

А когда подумаете, то сами решайте

vasya00 пишет:

хорошее ли решение

vasya00
Offline
Зарегистрирован: 30.05.2016

Согласен, тогда можно использовать каждое третье прерываение по 100 мс, чтобы изменить lampnumber на LOW, можно делать это на всех пинах куда подключены лампы каждые 300 мс, вне зависимости от того что там было до этого? И соответсвенно функция lampswitch будет только включать HIGH на соответствующий пин, всеравно через 300 мс все они перейдут в low. Или есть решение проще? Стоит запоминать и делать LOW прицельно?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
unsigned long mill;
typedef void (*pDo)();
//--------------------------------------
// класс лампы
enum {sLamP_OFF = 0, sLamP_ON, sLamP_flash};
class Cl_Lamp {
  protected:
    byte pin;
    unsigned long past, time;
    byte state;
    void stand(byte s) {
      state = s;
      past = mill;
      switch (state) {
        case sLamP_OFF:/*выкл*/
          digitalWrite(pin, LOW);
          break;
        case sLamP_ON:/*вкл*/
          digitalWrite(pin, HIGH);
          break;
        case sLamP_flash:/*вкл на время*/
          digitalWrite(pin, HIGH);
          break;
      }
    }
  public:
    Cl_Lamp(byte p): pin(p) {}
    void init() {
      pinMode(pin, INPUT);
      stand(sLamP_OFF);
    }
    void run() {
      if (state == sLamP_flash && mill - past >= time)stand(sLamP_OFF);
    }
    void flash(unsigned long t) {
      time = t;
      stand(sLamP_flash);
    }
};
//--------------------------------------
// класс сенсор HC-SR501
class Cl_HC_SR501 {
  protected:
    byte pin;
    pDo Do;
    bool btn, btnOld;
  public:
    Cl_HC_SR501(byte p, pDo D): pin(p), Do(D) {}
    void init() {
      pinMode(pin, INPUT);
    }
    void run() {
      btnOld = btn;
      btn = digitalRead(pin);
      if (!btn && btnOld) Do();
    }
};
//-------Компоновка-------------------------------
Cl_Lamp Lamp1(/*пин*/2);
Cl_Lamp Lamp2(/*пин*/3);
Cl_Lamp Lamp3(/*пин*/4);
Cl_Lamp Lamp4(/*пин*/5);
Cl_Lamp Lamp5(/*пин*/6);
unsigned long time_300msec = 300;
void DoSens1() {
  Lamp1.flash(time_300msec);
};
void DoSens2() {
  Lamp2.flash(time_300msec);
};
void DoSens3() {
  Lamp3.flash(time_300msec);
};
void DoSens4() {
  Lamp4.flash(time_300msec);
};
void DoSens5() {
  Lamp5.flash(time_300msec);
};
Cl_HC_SR501 Sens1(/*пин*/7,/*обработчик*/DoSens1);
Cl_HC_SR501 Sens2(/*пин*/8,/*обработчик*/DoSens2);
Cl_HC_SR501 Sens3(/*пин*/9,/*обработчик*/DoSens3);
Cl_HC_SR501 Sens4(/*пин*/10,/*обработчик*/DoSens4);
Cl_HC_SR501 Sens5(/*пин*/11,/*обработчик*/DoSens5);
//-------main()-------------------------------
void setup() {
  Lamp1.init();
  Lamp2.init();
  Lamp3.init();
  Lamp4.init();
  Lamp5.init();
  Sens1.init();
  Sens2.init();
  Sens3.init();
  Sens4.init();
  Sens5.init();
}
void loop() {
  mill = millis();
  Lamp1.run();
  Lamp2.run();
  Lamp3.run();
  Lamp4.run();
  Lamp5.run();
  Sens1.run();
  Sens2.run();
  Sens3.run();
  Sens4.run();
  Sens5.run();
}
/*Скетч использует 1692 байт (5%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 88 байт (4%) динамической памяти, оставляя 1960 байт для локальных переменных. Максимум: 2048 байт.
*/

Учитесь сами, и налаживайте сами. Все сами.

А это тема по этому стилю http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov

Но я не настаиваю