Математические действия

DIGIUS
Offline
Зарегистрирован: 17.09.2015

Доброго всем времени суток. Собираю спидометр с дисплеем на основе ардуины, дисплея,датчика хола и резистора к нему. Весь день промучался с проблемой что при выполнение математичиских действий получаю результат со знаком минус, хотя условием установленно что все входные значения только положительные. Так же выполняеться подряд 3 условия умножения. КОд который будет ниже в кратце выполняет следующие функции:
считывает колличество оборотов в секунду и пихает это в функцию

функция делает следующее:
проверяет положительность числа

колличество оборотов * на проходимую дистанцию за оборот * 3600 (секунд в часу) / 1000 (метров в километре) = дистанцию км/ч
к примеру:
дистанция проходимая за раз = 1.8 метра

количество оборотов = 4

получаем:

4*1.8 = 7.2 метра за секунду

7.2*3600 = 25920 метров в час при текущей скорости

25920 / 1000 = 25,92 км/ч.

Вот код:

int ap[] = {8, 9,7,4,10,11,12,6,13}; //Индексы рабочих пинов 
#define radius 1.8 //1,80 м проезжает колесо при одном обороте
 unsigned long cM = millis();
 unsigned long pM = 0;    
boolean interval(int t){
  cM = millis();
  if (cM- pM >= t) {
    pM = cM;
    return true;
  }
  return false;
}
float speed(int msinsec){
if(msinsec<=1){
  return  0;
}else{
int dd = msinsec-1;
dd = dd*radius;
dd = dd*3600;
dd=dd/1000;
Serial.println(dd,DEC);
return dd;
}
}

void setup()  {
  Serial.begin(9600);
  for(int i =0;i<=sizeof(ap);i++){pinMode(ap[i], OUTPUT);}
}
int total=1,trigger=0;
void loop()  {
if(!digitalRead(6) && trigger == 0){
   // Serial.println(total);
     total++;
    trigger = 1;
 }
 if(digitalRead(6) && trigger == 1){
   trigger = 0;
 }
 if(interval(1000)){
  int spd = speed(total);
  if(spd>0){
  Serial.println(spd, DEC);
  }
  total=1;
 }
}
       
 

Ткните меня носом в ошибку, заранее спасибо!

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

В строке 17 dd определяется как целое. Если передать в функцию speed большое число, например, 20000, то будет переполнение. Т.е. переполнение нужно ловить в строках 17-19. А переполнение, это смена знака с плюса на минус. Думаю, что и на меньших числах будет тоже самое.

Не знаю, при каких значениях будет отрицательный результат, спать охота, но у тебя "защиты" от этого нет, нужно правильно реализовать алгоритм и правильно использовать типы данных. Про максимальные значения int можно посмотреть, например, здесь https://www.arduino.cc/en/Reference/Int