switch quantity not an integer

woodsylvan
Offline
Зарегистрирован: 11.10.2016

Помогите разобраться, задаю функцию с возвращающимся значением int, затем использую оператор switch где используются эти значения, при компиляции выдает ошибку что значение не int.

error: switch quantity not an integer

вот фрагменты кода:

int SolderingStatus(){
  if (old_tempust != tempust) return 1;   
  else return 0;
}
void loop (){
switch (SolderingStatus){
  case 0:
    while ((millis() - currentTime) < 1000) {
    printNumber1(tempust);
    }
    break;
  case 1:
    printNumber1(tempreal);
  }
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

Замените SolderingStatus на SolderingStatus()

woodsylvan
Offline
Зарегистрирован: 11.10.2016

Araris пишет:

Замените SolderingStatus на SolderingStatus()

спасибо огромное помогло!

Подскажите еще если не трудно, по задержке. Дописал сюда такой код:

int SolderingStatus(){
  if (old_tempust != tempust) return 0;
  else return 1;
}

void loop (){
tempust = myEnc.read()/2;   // считываем установленную температуру
switch (SolderingStatus()){
  case 0:
    printNumber1(tempust);
    break;
  case 1:
    printNumber1(tempreal);
    break;
  }
  if(millis() - actual_count_delay > 3000) { // Задержка вывода установленной температуры  
     actual_count_delay = millis(); 
     old_tempust = tempust;
  }
}

 

Тут проблема такая: при изменении параметра tempust должна происходить задержка перед обнулением параметра old_tempust = tempust , но тут получается происходит задержка не от изменения параметра а от старта программы, тоесть задежка происходит хаотично в пределах от 0-3 сек. Подскажите как исправить чтобы задержка начиналась каждый раз при повороте энкодера? 

Araris
Offline
Зарегистрирован: 09.11.2012

woodsylvan пишет:

  Подскажите как исправить чтобы задержка начиналась каждый раз при повороте энкодера? 

Если я правильно понял вышенаписанное, вместо if(millis() - actual_count_delay > 3000)

поставьте if( (millis() - actual_count_delay > 3000) && (old_tempust != tempust) )

А может достаточно просто if(old_tempust != tempust)

 

woodsylvan
Offline
Зарегистрирован: 11.10.2016

Araris пишет:

Если я правильно понял вышенаписанное, вместо if(millis() - actual_count_delay > 3000)

поставьте if( (millis() - actual_count_delay > 3000) && (old_tempust != tempust) )

А может достаточно просто if(old_tempust != tempust)

К сожалению ничего не поменялось, цифры все равно выводяться как получиться могут на 0,1 сек высветиться, а могут и на 3.

http://radikal.ru/video/Uq3ZWAZ23Tq

GarryC
Offline
Зарегистрирован: 08.08.2016

Вам нужно задать начальное значение для отсчета интервала 3 сек - переменную actual_count_delay.

После строки 10 добавьте actual_count_delay=millis();

woodsylvan
Offline
Зарегистрирован: 11.10.2016

GarryC пишет:

Вам нужно задать начальное значение для отсчета интервала 3 сек - переменную actual_count_delay.

После строки 10 добавьте actual_count_delay=millis();

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

Logik
Offline
Зарегистрирован: 05.08.2014

Как обявлена actual_count_delay?

woodsylvan
Offline
Зарегистрирован: 11.10.2016

Logik пишет:

Как обявлена actual_count_delay?

Обьявлена в самом начале еще до сетапа long actual_count_delay = 0;

GarryC
Offline
Зарегистрирован: 08.08.2016

Хм не должно так быть.
Вроде понял. Вам надо завести еще одну промежуточную переменную для изменившейся установки TempTmp.

int SolderingStatus(){
   static TempTmp =0;
   if (TempTmp == tempust) return 1;
  TempTmp = tempust; return 0;
};

woodsylvan
Offline
Зарегистрирован: 11.10.2016

GarryC пишет:

Хм не должно так быть.
Вроде понял. Вам надо завести еще одну промежуточную переменную для изменившейся установки TempTmp.

int SolderingStatus(){
   static TempTmp =0;
   if (TempTmp == tempust) return 1;
  TempTmp = tempust; return 0;
};

К сожалению это не решает проблему, нужно задание времени в месте:

switch (SolderingStatus()){
  case 0:
    printNumber1(tempust);
    actual_count_delay = (millis()+5000); //как тут например
    break;

а далее как-то нужно чтобы из этого полученного значения actual_count_delay вычиталось по 1мс до совпадения со значением millis() и далее после достижения условия выполнялась команда old_tempust = tempust;

непонимаю как так можно реализовать, плохо без команды than.

 

 

woodsylvan
Offline
Зарегистрирован: 11.10.2016

Ребят, ну помогите додумать как сделать задержку

int SolderingStatus(){
  if (old_tempust == tempust) return 1;
  else return 0;
}
void loop (){
  tempust = myEnc.read()/2;   // считываем установленную температуру
  if (tempust > 450){  //Выставляем ограничение макс.температуры
    myEnc.write(900);
  }
  if (tempust < 250){   //Выставляем ограничение мин.температуры
    myEnc.write(500);
  }  
switch (SolderingStatus()){
  case 0:
    printNumber1(tempust);
    break;
  case 1:
    printNumber1(tempreal);
    actual_count_delay = (millis()+3000);
    break;
  }
  if(millis() - actual_count_delay > 0) {  // Задержка вывода установленной температуры 
     old_tempust = tempust;
  }
}

Программа по дефолту работает на case 1, при этом постоянно меняется значение actual_count_delay в большую на 3сек сторону. Когда энкодером меняю значение tempust программа переходит на  case 0 тоесть значение actual_count_delay перестает меняться и дплее по истечении 3сек должно срабатывать условие if(millis() - actual_count_delay > 0) и присваиваться old_tempust = tempust, программа опять должна переходить на case 1

Вроде логически все правильно, но почему-то в последней строчке значение old_tempust = tempust присваивается вне зависимости от того сработало ли условие millis() - actual_count_delay > 0

woodsylvan
Offline
Зарегистрирован: 11.10.2016

Отвечу сам, может кому поможет... Значение разницы не может быть отрицательным числом! поэтому условие  millis() - actual_count_delay постоянно срабатывает. решилось установкой условия if(millis() > actual_count_delay)

Буду признателен если подскажете как сделать так, чтобы таймер задержки actual_count_delay = (millis()+3000); менялся от поворота энкодера, ато получается он срабатывает всегда через 3 сек. Тоесть только когда я не кручу энкодер он должен обновляться.