вопрос по циклам void()
- Войдите на сайт для отправки комментариев
Сб, 11/01/2014 - 12:44
Всем привет! В последнее время очень часто стал встречать программы с несколькими циклами void, т.е. Помимо void setup() и void loop() присутствуют и другие к примеру для управления моторами void left() void forward() и т.д. Подскажите где можно почитать про данный принцип построения программы, ну или сами расскажите,если не сложно)
http://arduino.ru/Hacking/LibraryTutoria
Первый абзац...
А при чем тут циклы?
void left() это функция, которая в качестве параметров ничено не принимает и начего не возвращает
принцип простой - это упрощает понимание алгоритма программы и ее модификацию/отладку.
Ниже два упрощенных фрагмента кода "умного гаража". Функционально это одно и то же, но какой код проще понять и отлаживать?
Пример 1:
#define LAMP_PIN 13 #define LIGHT_SENSOR_PIN 9 #define MOTION_SENSOR_PIN 10 #define BUTTON_PIN 4 #define IR_PIN 2 #define LOCK_PIN 7 #define BUZZER_PIN 11 #define ZONE1_PIN 5 #define ZONE2_PIN 6 #define CHECK_ZONE1 digitalRead(ZONE1_PIN) #define CHECK_ZONE2 digitalRead(ZONE2_PIN) #define NIGHT digitalRead(LIGHT_SENSOR_PIN) #define HUMAN_DETECTED digitalRead(MOTION_SENSOR_PIN) #define UNLOCK_BUTTON digitalRead(BUTTON_PIN) #define REMOTE_DETECTED digitalRead(IR_PIN) boolean sms_open = false; boolean sms_alarm = false; int timeLamp = 30; const String smsNumber = "+7926XXXXXXX"; String smsMessage = ""; void setup() { pinMode(LAMP_PIN, OUTPUT); pinMode(LOCK_PIN, OUTPUT); pinMode(BUZZER_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(ZONE1_PIN, INPUT_PULLUP); pinMode(ZONE2_PIN, INPUT_PULLUP); } void loop() // основной цикл { if (NIGHT && HUMAN_DETECTED) lampOn(); // если темно И сработал датчик движения, то на 30 сек включить освещение if (UNLOCK_BUTTON || REMOTE_DETECTED || sms_open) doorOpen(); // если сигнал от кнопки ИЛИ брелка ИЛИ SMS, то открыть замок ворот, на 2 мин включить освещение и уведомить по SMS alarm(); // проверка охранного контура } // конец loop void lampOn() // блок включения лампы и ее плавного выключения { digitalWrite(LAMP_PIN, HIGH); // включаем лампу delay(timeLamp * 1000); // ждем заданное число секунд FadeLamp(); // плавное гашение лампы } void alarm() // блок проверки охранного контура { if (CHECK_ZONE1 || CHECK_ZONE1) // если нарушен периметр 1 ИЛИ периметр 2 { sms_alarm = true; sirena(); // врубаем сирену smsInfo(); // отправляем SMS с информацией о совершенных действиях sms_alarm = false; // возвращаем исходное состояние флага } } void FadeLamp() // функция плавного выключения лампы { for(byte i = 255; i >= 0; i--) { analogWrite(LAMP_PIN, i); delay(20); } } void doorOpen()// блок открытия дверей и включения света { timeLamp = 120; // переназначаем длительность включения света digitalWrite(LOCK_PIN, HIGH); // открываем замок ворот lampOn(); // одновременно включаем свет и ждем 2 мин timeLamp = 30; // возвращаем исходную длительность включения света digitalWrite(LOCK_PIN, LOW); // закрываем замок ворот smsInfo(); // отправляем SMS с информацией о совершенных действиях } void sirena() // блок паники { for(byte i = 0; i <= 50; i++) // громко шумим 50 циклов { digitalWrite(BUZZER_PIN, HIGH); delay(200); digitalWrite(BUZZER_PIN, LOW); delay(100); } } void smsInfo() // блок проверки охранного контура { if (sms_alarm) smsMessage="ALARM! Invasion detected!!!"; if (sms_open) smsMessage="Door will be opened."; sms.send(smsNumber, smsMessage); smsMessage = ""; // очищаем текстовую переменную }Пример 2:
#define LAMP_PIN 13 #define LIGHT_SENSOR_PIN 9 #define MOTION_SENSOR_PIN 10 #define BUTTON_PIN 4 #define IR_PIN 2 #define LOCK_PIN 7 #define BUZZER_PIN 11 #define ZONE1_PIN 5 #define ZONE2_PIN 6 boolean sms_open = false; boolean sms_alarm = false; int timeLamp = 30; const String smsNumber = "+7926XXXXXXX"; String smsMessage = ""; void setup() { pinMode(LAMP_PIN, OUTPUT); pinMode(LOCK_PIN, OUTPUT); pinMode(BUZZER_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(ZONE1_PIN, INPUT_PULLUP); pinMode(ZONE2_PIN, INPUT_PULLUP); } void loop() // основной цикл { if (digitalRead(LIGHT_SENSOR_PIN) = HIGH) // если темно { if (digitalRead(MOTION_SENSOR_PIN) = HIGH) // И если сработал датчик движения, то на 30 сек включить освещение { digitalWrite(LAMP_PIN, HIGH); // включаем лампу delay(timeLamp * 1000); // ждем заданное число секунд for(byte i = 255; i >= 0; i--) // цикл плавного выключения лампы { analogWrite(LAMP_PIN, i); delay(20); } } } // если поступил сигнал от кнопки, то открыть замок ворот, на 2 мин включить освещение и уведомить по SMS if (digitalRead(BUTTON_PIN) = HIGH) { digitalWrite(LAMP_PIN, HIGH); // включаем лампу digitalWrite(LOCK_PIN, HIGH); // открываем замок ворот delay(timeLamp * 1000 * 6); // ждем for(byte i = 255; i >= 0; i--) // цикл плавного выключения лампы { analogWrite(LAMP_PIN, i); delay(20); } digitalWrite(LOCK_PIN, LOW); // закрываем замок ворот sms.send(smsNumber, "Door will be opened"); // отправляем SMS с информацией о совершенных действиях } // если поступил сигнал от брелка, то открыть замок ворот, на 2 мин включить освещение и уведомить по SMS if (digitalRead(IR_PIN) = HIGH) { digitalWrite(LAMP_PIN, HIGH); // включаем лампу digitalWrite(LOCK_PIN, HIGH); // открываем замок ворот delay(timeLamp * 1000 * 6); // ждем for(byte i = 255; i >= 0; i--) // цикл плавного выключения лампы { analogWrite(LAMP_PIN, i); delay(20); } digitalWrite(LOCK_PIN, LOW); // закрываем замок ворот sms.send(smsNumber, "Door will be opened"); // отправляем SMS с информацией о совершенных действиях } // если поступила SMS на открытие, то открыть замок ворот, на 2 мин включить освещение и уведомить по SMS if (sms_open = true) { digitalWrite(LAMP_PIN, HIGH); // включаем лампу digitalWrite(LOCK_PIN, HIGH); // открываем замок ворот delay(timeLamp * 1000 * 6); // ждем 2 минуты for(byte i = 255; i >= 0; i--) // цикл плавного выключения лампы { analogWrite(LAMP_PIN, i); delay(20); } digitalWrite(LOCK_PIN, LOW); // закрываем замок ворот sms.send(smsNumber, "Door will be opened"); // отправляем SMS с информацией о совершенных действиях } // проверка охранного контура if (digitalRead(ZONE1_PIN) == false) { sms_alarm = true; } if (digitalRead(ZONE2_PIN) == false) { sms_alarm = true; } if (sms_alarm = true) { for(byte i = 0; i <= 50; i++) // врубаем сирену на 50 циклов { digitalWrite(BUZZER_PIN, HIGH); delay(200); digitalWrite(BUZZER_PIN, LOW); delay(100); } sms.send(smsNumber, "ALARM! Invasion detected!!!"); // отправляем SMS с информацией о совершенных действиях sms_alarm = false; // возвращаем исходное состояние флага } } // конец loopПервый код, где каждая функция выделена отдельно, и читать проще (второй пример через полгода сможешь разобрать - что оно делает?), и места занимает меньше (90 строк против 114) и при отладке можно каждую функцию отключить в один клик (закомментировав лишь ее вызов: // smsInfo(); )