Управление набором ламп освещения
- Войдите на сайт для отправки комментариев
Сб, 19/05/2018 - 01:45
Здравствуйте, задумка такая: есть десяток PIR датчиков HC-SR501, и десяток выключателей освещения, нужно все это совместить с помощью Arduino, и вести учет. Вопрос в том как красивее это реализовать. Пока представление следующее, написать функцию переключение выключателя освещения, она будет выглядить так:
void lampswitch (byte lampnumber)
{
digitalWrite(lampnumber,HIGH);
delay(300);
digitalWrite(lampnumber,LOW);
}
в качестве параметра передавать ей номер лампы. Осталось только выяснить какой из десятка латчиков сработал, и передать его номер этой функции. Можно конечно опрашивать все десять последовательно, и если сигнал от какого то из датчиков HIGH, запустить lampswitch с соответствующим номером. Но может есть более короткое и красивое решение?
Спасибо!
Странно но у вас в коде я вижу что нужно передавать номер пина.
Очень сомневаюсь что это чем то поможет в реализации задачи.
Можно вообще ничего не опрашивать и ничего работать не будет
Делаем быстро качественно и недорого.... выбирайте 2....
Решение или красивое с точки зрения кода или затрат ресурсов? Короткое? опять тот же вопрос, короткое по коду или по ресурсам?.
Можно прерывания, можно циклы, можно наговнокодить все проверки руками, можно вообще уйти в ООП и сделать ебическую архитектуру для тривиальной задачи. Все варианты имеют право на жизнь, но не все они уместны для любой задачи.
Ваш случай сначало наговнокодить всё руками, потом перейти к циклам.
зы. Вы очень рано заморочились с оптимизацией, не нужно этого делать при отсутствии навыков программирования от слова совсем..
Делаете чтоб просто работало, а потом придет понимание что и где нужно оптимизировать.
А какой смысл включать лампу на 300мс, а потом выключать?
И делать это раз в три секунды?
..
Но может есть более короткое и красивое решение?
/**/ 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 байт. */Там выключатель который управляется импульсом 300 мс, раз в три секунды не нужно.
Подскажите, пожалуйста хорошее ли решение: прерыванием по таймеру каждые 100 мс, считывать состояния пинов с подключенными PIR датчиками, в цикле от 1 до 10 по количеству датчиков, в случае если на пине HIGH, выполнить функцию lampswitch с параметром номера прохода цикла. Будет ли успевать Arduino за 100 мс считать состояния 10 пинов в цикле?
Спасибо!
прерыванием по таймеру каждые 100 мс, считывать состояния пинов с подключенными PIR датчиками, в цикле от 1 до 10 по количеству датчиков, в случае если на пине HIGH, выполнить функцию lampswitch с параметром номера прохода цикла.
Ну, как бы, считываем каждые 100мс. Время выполнения функции lampswitch - 300+ мс. Возможно, придётся выполнить до 10 таких функций.
Вот и думайте
Будет ли успевать Arduino за 100 мс
выполнить 1-10 функций по 300мс каждая?
А когда подумаете, то сами решайте
хорошее ли решение
Согласен, тогда можно использовать каждое третье прерываение по 100 мс, чтобы изменить lampnumber на LOW, можно делать это на всех пинах куда подключены лампы каждые 300 мс, вне зависимости от того что там было до этого? И соответсвенно функция lampswitch будет только включать HIGH на соответствующий пин, всеравно через 300 мс все они перейдут в low. Или есть решение проще? Стоит запоминать и делать LOW прицельно?
/**/ 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
Но я не настаиваю