switch quantity not an integer
- Войдите на сайт для отправки комментариев
Втр, 11/10/2016 - 14:27
Помогите разобраться, задаю функцию с возвращающимся значением 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);
}
}
Замените SolderingStatus на SolderingStatus()
Замените 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 сек. Подскажите как исправить чтобы задержка начиналась каждый раз при повороте энкодера?
Подскажите как исправить чтобы задержка начиналась каждый раз при повороте энкодера?
Если я правильно понял вышенаписанное, вместо
if(millis() - actual_count_delay > 3000)поставьте
if( (millis() - actual_count_delay > 3000) &&(old_tempust != tempust) )А может достаточно просто
if(old_tempust != tempust)Если я правильно понял вышенаписанное, вместо
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
Вам нужно задать начальное значение для отсчета интервала 3 сек - переменную actual_count_delay.
После строки 10 добавьте actual_count_delay=millis();
Вам нужно задать начальное значение для отсчета интервала 3 сек - переменную actual_count_delay.
После строки 10 добавьте actual_count_delay=millis();
Если это добавить, то значение высвечивается бесконечно т.к ниже где происходит расчет разницы времени всегда будет 0
Как обявлена actual_count_delay?
Как обявлена actual_count_delay?
Обьявлена в самом начале еще до сетапа long actual_count_delay = 0;
Хм не должно так быть.
Вроде понял. Вам надо завести еще одну промежуточную переменную для изменившейся установки TempTmp.
int SolderingStatus(){
static TempTmp =0;
if (TempTmp == tempust) return 1;
TempTmp = tempust; return 0;
};
Хм не должно так быть.
Вроде понял. Вам надо завести еще одну промежуточную переменную для изменившейся установки 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.
Ребят, ну помогите додумать как сделать задержку
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
Отвечу сам, может кому поможет... Значение разницы не может быть отрицательным числом! поэтому условие millis() - actual_count_delay постоянно срабатывает. решилось установкой условия
if(millis() > actual_count_delay)Буду признателен если подскажете как сделать так, чтобы таймер задержки actual_count_delay = (millis()+3000); менялся от поворота энкодера, ато получается он срабатывает всегда через 3 сек. Тоесть только когда я не кручу энкодер он должен обновляться.