Функция внутри if не работает

fedorangaarsk
Offline
Зарегистрирован: 10.06.2017

Не работает моя простейшая функция внутри оператора if, без If работает, в for работает.

Я новичок в программировании и в Arduino. Потихоньку осваиваю от простого к сложному. Разбираясь в функциях я столкнулся с проблемой, в которой ошибочность мне неочевидна, поэтому прошу указать на возможные недочеты и указать что именно почитать. Информацию беру из уроков по Ардуино, с этого сайта референс, читаю C programming for Arduino.

Проблем возникла при работе с сенсорной кнопкой. Где при соприкосновении с сенсором по моей задумке диод должен мигать одним образом, а при отсутствии соприкосновения - другим. Эти разные частоты мигания я решил "упаковать" как разные функции и их вызывать согласно событиям. Простейшую мигалку записал в фукнцию blinkLed и опробовал задав необходимые параметры - мигает как нужно. Когда же я попробовал вызвать эту фукнцию по соотвествию условию внутри оператора if, то обнаружил, что диод не мигает совершенно. Однако если явно прописать включить/выключить диод, то оператор if все отрабатывает.

После этого отказался от сенсорной кнопки и стал проверять простое условие if больше/меньше - ситуация такая же. Привожу код скетча с моими комментариями. Скетч компилируется и заливается без ошибок. Плата Arduino Nano. Учусь в Arduino IDE 1.8.2 в Kubuntu 16.04.2

/*Скетч где при проверке условия внутри if функция не работает*/

int ledPin = 13; //пин для светодиода

void setup() {
  Serial.begin(9600); //начинаем обмен с последовательным портом
  pinMode(ledPin, OUTPUT); //13 пин с СИД на выход
}

void blinkLed(int, int); //объявим функцию

void loop() {
  int timeLedOn = 1000; //задаем время включения диода
  int timeLedOff = 200;  //задаем время выключения диода
  int a = 5; //эта переменная только для проверки условий в if
  if (a >= 3) //просто условие для проверки if, типа при одном условии диод мигает, в другом просто горит
  {
    /* Если использовать такой код, то диод будет мигать, а вот с вызовом функции не мигает совсем. Хотя в выводе
        последовательного порта показывает верные значения Touched/Not touched Здесь время включения-выключения
        инвертитовано относительно функции blinkLed чтобы знать отчего мигает диод

       digitalWrite(ledPin, LOW);
       delay(1200);
       digitalWrite(ledPin, HIGH);
       delay(100);*/
    void    blinkLed(int timeLedOn, int timeLedOff);  //вот здесь диод НЕ МИГАЕТ и НЕ ГОРИТ совсем, в мониторе порта Touched

    Serial.println("Touched");
    delay(200);
  }
  else {
    digitalWrite(ledPin, HIGH); //просто включим диод без мигания, здесь все в порядке при a<3
    Serial.println("Not touched");
    delay(200);
  }
}

void blinkLed(int timeLedOn, int timeLedOff)  //функция мигания диодом с заданными временами включения и выключения диода
{
  digitalWrite(ledPin, HIGH);
  delay(timeLedOn); //время включения диода
  digitalWrite(ledPin, LOW);
  delay(timeLedOff); //время выключения диода
  return;
}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

26 строка - это НЕ вызов функции. Посмотри рядом вызовы функции, например digitalWrite, delay и т.п.

fedorangaarsk
Offline
Зарегистрирован: 10.06.2017

Если вызываю функцию в 26 строке так:

blinkLed(timeLedOn,timeLedOff);  //А теперь мигает как нужно, спасибо!!!

то все работает.  Спасибо Kisoft!

В итоге получилось следующее!

/* Скетч мигания диодами разными способами */

int ledPin = 13; //пин для светодиода

void setup() {
  Serial.begin(9600); //начинаем обмен с последовательным портом
  pinMode(ledPin, OUTPUT); //13 пин с СИД на выход
}

void blinkLed(int, int); //объявим функцию

void loop() {
  int timeLedOn = 1000; //задаем время включения диода
  int timeLedOff = 50;  //задаем время выключения диода
  int a = 5; //эта переменная только для проверки условий в if
  if (a >= 3) //просто условие для проверки if, типа при одном условии диод мигает, в другом просто горит
  {
    blinkLed(timeLedOn, timeLedOff); //вот здесь диод мигает
    Serial.println("Touched");
    delay(200);
  }
  else {
    blinkLedInverced(timeLedOn, timeLedOff);
    Serial.println("Not touched");
    delay(200);
  }
}

void blinkLed(int timeLedOn, int timeLedOff)  //функция мигания диодом с заданными временами включения и выключения диода
{
  digitalWrite(ledPin, HIGH);
  delay(timeLedOn); //время включения диода
  digitalWrite(ledPin, LOW);
  delay(timeLedOff); //время выключения диода
  return;
}

void blinkLedInverced(int timeLedOn, int timeLedOff)  //функция инверсная мигания диодом с заданными временами включения и выключения диода
{
  digitalWrite(ledPin, HIGH);
  delay(timeLedOff); //время включения диода на время выключения диода в прямой функции blinkLed
  digitalWrite(ledPin, LOW);
  delay(timeLedOn); //время выключения диода на время включения в прямой функции blinkLed
  return;
}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Главное чтобы ты понял что было написано в первом варианте