вопрос по циклам void()

Hobigo
Offline
Зарегистрирован: 14.01.2013

Всем привет! В последнее время очень часто стал встречать программы с несколькими циклами void, т.е. Помимо void setup() и void loop() присутствуют и другие к примеру для управления моторами void left() void forward() и т.д. Подскажите где можно почитать про данный принцип построения программы, ну или сами расскажите,если не сложно)

inspiritus
Онлайн
Зарегистрирован: 17.12.2012

http://arduino.ru/Hacking/LibraryTutoria

Первый абзац...

carduino.ru
Offline
Зарегистрирован: 06.12.2011

А при чем тут циклы?

void left() это функция, которая в качестве параметров ничено не принимает и начего не возвращает

 

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

принцип простой - это упрощает понимание алгоритма программы и ее модификацию/отладку.

Ниже два упрощенных фрагмента кода "умного гаража". Функционально это одно и то же, но какой код проще понять и отлаживать?

Пример 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(); )