Математические действия
- Войдите на сайт для отправки комментариев
Доброго всем времени суток. Собираю спидометр с дисплеем на основе ардуины, дисплея,датчика хола и резистора к нему. Весь день промучался с проблемой что при выполнение математичиских действий получаю результат со знаком минус, хотя условием установленно что все входные значения только положительные. Так же выполняеться подряд 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;
}
}
Ткните меня носом в ошибку, заранее спасибо!
В строке 17 dd определяется как целое. Если передать в функцию speed большое число, например, 20000, то будет переполнение. Т.е. переполнение нужно ловить в строках 17-19. А переполнение, это смена знака с плюса на минус. Думаю, что и на меньших числах будет тоже самое.
Не знаю, при каких значениях будет отрицательный результат, спать охота, но у тебя "защиты" от этого нет, нужно правильно реализовать алгоритм и правильно использовать типы данных. Про максимальные значения int можно посмотреть, например, здесь https://www.arduino.cc/en/Reference/Int