Ви не увійшли.
Максим, давайте напишемо вашу функцію по іншому
Будемо читати датчик на кожному проході loop().
Оскільки у вас імпульс аналоговий, будемо ловити його вершину.
Будемо дивитися, скільки часу пройшло між двома імпульсами.
По цьому часу будемо рахувати "миттєву" швидкість.
void loop()
{
int impulseValue = analogRead(IMPULSE_PIN);
static int prevImpulseValue = impulseValue;
bool impulseRaises = (impulseValue > prevImpulseValue);
static bool prevImpulseRaises = impulseRaises;
static long prevImpulseTime = millis();
if (prevImpulseRaises && !impulseRaises) // зловили вершину імпульсу
{
long impulseTime = millis();
long impulseDuration = impulseTime - prevImpulseTime; // impulseDuration в мілісекундах
long speed = 602 / impulseDuration; // 602 = 1000 / 1.66
Serial.print("speed: "); Serial.println(speed);
prevImpulseTime = impulseTime;
}
prevImpulseValue = impulseValue;
prevImpulseRaises = impulseRaises;
}
Декілька ремарок:
static змінні ініціалізуємо поточними значеннями.
Обчислення ведемо в цілочисельному форматі, оскільки операції з float дорого коштують. speed можна було б писати в метрах/годину для більшої точності, для цього замість 602 впишемо 602000.
Можливо, значення з датчика шумлять, тоді прийдеться згладжувати сигнал. Або реалізувати інший варіант: замість вершини ловимо момент, коли сигнал проходить коридор, наприклад 200-800.
Я код не перевіряв. Якщо буде глючити, варто писати лог (Serial.print) починаючи зі значень сигналу і поступово доходячи до значень швидкості.
А бы советовал использовать оптопару вместо делителя, сам столкнулся недавно с логикой 12В.
Оптопара например sharp pc817
Спасибо , так и сделаю ,даже можно использовать цыфровой пин а не аналоговый, позже в исправленном варианте выложу в свободный доступ чертежи плат и схему устройства, но 1 образец сделал на делителе , так что буду делать с ним .
На выходных ставил на машину испытывал, паказывает чесно сказать ерунду , показания вроде как зависят от скорости , но на скорости допустим примерно 20 км.ч. показывает значения от 0 до 24 и периодически (раз в несколько секунд) даже за 100км.ч. наверное ошибка в программе, когда автомобиль не двигается показывает стабильно 0.
А бы советовал использовать оптопару вместо делителя, сам столкнулся недавно с логикой 12В.
Оптопара например sharp pc817
Штатный датчик скорости авто выдает импульсы амплитудой до 12 В.
1 км/ч . соотваетствует частоте 1,66 Гц. на датчике.
60 км/ч = 100 Гц.
100км/ч = 166 Гц.
Датчик подключен на аналоговый, вход arduino pro mini , через делитель напряжения задача состоит в том чтобы считать текущею скорость автомобиля и его пробег.
Функция для определения скорости ниже.
int checkSpeed(){
unsigned long time1 =millis(); // определяем время начала выполнения функции если > 1000 возвращаем 0
unsigned long pulseStart; // начало первого импульса
int pulse=0; // длинна импульса в мс.
int schet=0; // 0 - начало первого импульса , 1 - конец первого , 2 начало второго (время между 0 и 2 -- частота )
while (millis()-time1<300){ //цыкл выполняется если с момента начала выполнения прошло меньше 300 мс.
if (analogRead(SPEEDPIN)>600 && schet==2){
pulse = millis()- pulseStart;
return 1000/pulse/1.66;
}
else if (analogRead(SPEEDPIN)>600 && schet==0){
pulseStart=millis();
schet =1;
}
else if(analogRead(SPEEDPIN)<600 && schet==1){
schet =2;
}
}
return 1000/pulse/1.66;
константа SPEEDPIN определена раньше (пин который подключен к датчику скорости).
Будет ли работать эта функция (протестировать на автомобиле пока нету возможности ), и как реализовать подсчет пробега?
Спасибо.