PHP код:
void int_on()
{
count++; //увеличить счетчик volatile
if (count >=2) //ждем 2 импульса - 2имп=0,8м
{
speedtime = micros()-time; //время прихода 2 импульсов
time = micros(); //обнулить
Speed=((0.8*3600000)/speedtime); //перевод в км/ч
Serial.println(speedtime);
Serial.println(Speed);
count = 0;
}
}
При скорости 5 км/ч., ты два импульса, целую вечность будешь ждать!!!
Надо один импульс мерить (и то долго)!
С диаметром колеса тоже не к чему заморачиваться, я взял скорость с GPS и корректировал числитель (650000).
Убери лишнее вычисление Speed=((0.8*3600000)/speedtime); 0.8*3600000 = 2880000.
Получится Speed = (2880000 / speedtime);
И всю дьявольщину (Serial.println(speedtime); Serial.println(Speed); ) тоже убери из прерывания ))))))))))))
PHP код:
/////////////// СПИДОМЕТР//////////////////////////////////////
dinaimpulsov = pulseIn(3, HIGH, 100000); // Считывание длительности
ValSpCurr = (650000 / dinaimpulsov); // Перевод в км/ч
if (dinaimpulsov > 120000 || ValSpCurr > 350)
{
ValSpCurr = 0;
}
if (ValSpCurr > peakspeed) //pikspeed
{
peakspeed = ValSpCurr;
И функция pulseIn(); не очень подходит для этих целей, при низкой скорости авто она всю программу тормозит, пока ждёт конца импульса.
Сделал на прерывании.
PHP код:
void int_on()
{
spidometr = micros()-time; //время прихода импульсa
time = micros(); //обнулить
ValSpCurr = (1450000 / spidometr);
}
}
А чтоб не было вот этого: (я с этим тоже столкнулся)
Единственно бывает, что скорость отличается на 3-4 км между соседними срабатываниями таймера, например 39 и 36, на самом деле скорость ~40
Я думаю надо при скорости свыше 20 км/ч. , брать три-четыре последних значения и выводить среднее арифметическое, тогда наверно не будет разброса.
Сейчас проверить не могу, по причине поломки авто...
А на столе всё круто работает))))))
Вабще со скоростью запара, с оборотами всё проще гораздо))))))))
PHP код:
void loop()
//////////////////////////ТАХОМЕТР///////////////////////////////////////
{
if (taxometr > 6000)
{
taxo = (80000000 / taxometr);
}
else
{
taxo = 0;
}
if (taxo > peakrpm) //pikrpm
{
peakrpm = taxo;
}
void int_on()
{
count++; //увеличить счетчик volatile
if (count >= 4)
{
taxometr = micros()-time; //время прихода 4-ти импульсов
time = micros(); //обнулить
count = 0;
}
}