Всем привет!
Передо мной встала задача отслеживать обороты двигателя и скорость в автомобиле (по сути измерять частоту сигнала), чтобы среагировать на их превышение (типа Shift Light и Speed Limit). Проект на адресных светодиодах с настройкой через Wi-Fi, поэтому я использую ESP8266 и библиотеку "Tachometr" от Алекса Гайвера. Она очень быстро и очень точно измеряет частоту сигнала, как на столе (когда сигнал приходит от генератора частоты), так и в автомобиле. Однако, присутствуют ложные срабатывания функции превышения оборотов и скорости, в момент включения мощной нагрузки в автомобиле (центральный замок, дворники и т п). Я предполагаю что это происходит из-за помех по питанию. Ниже я приведу схему, а так же фрагмент кода.
Внимание вопрос: правильно ли я понимаю природу ложных срабатываний и как в таком случае избавиться от помех?
Передо мной встала задача отслеживать обороты двигателя и скорость в автомобиле (по сути измерять частоту сигнала), чтобы среагировать на их превышение (типа Shift Light и Speed Limit). Проект на адресных светодиодах с настройкой через Wi-Fi, поэтому я использую ESP8266 и библиотеку "Tachometr" от Алекса Гайвера. Она очень быстро и очень точно измеряет частоту сигнала, как на столе (когда сигнал приходит от генератора частоты), так и в автомобиле. Однако, присутствуют ложные срабатывания функции превышения оборотов и скорости, в момент включения мощной нагрузки в автомобиле (центральный замок, дворники и т п). Я предполагаю что это происходит из-за помех по питанию. Ниже я приведу схему, а так же фрагмент кода.
Внимание вопрос: правильно ли я понимаю природу ложных срабатываний и как в таком случае избавиться от помех?
Код:
// НАСТРОЙКИ ТАЙМЕРА
#include <TimerMs.h> // подключаем библиотеку таймера от Алекса Гайвера
TimerMs main_tmr(1, 1, 0); // создаём объект таймера (период, 1 мс), (0 не запущен / 1 запущен), (режим: 0 период / 1 таймер)
// НАСТРОЙКИ ТАХОМЕТРА
#include <Tachometer.h> // подключаем библиотеку тахометра от Алекса Гайвера
Tachometer tacho; // создаём объект тахометра
Tachometer speed; // создаём объект спидометра
void ICACHE_RAM_ATTR tach_isr(); // объявляем функцию-обработчик прерывания тахометра
void ICACHE_RAM_ATTR speed_isr(); // объявляем функцию-обработчик прерывания спидометра
#define TACH_PIN 5 // пин тахометра
#define SPEED_PIN 4 // пин тахометра
void tach_isr()
{
tacho.tick(); // вызываем тикер тахометра в прерывнии
}
void speed_isr()
{
speed.tick(); // вызываем тикер спидометра в прерывнии
}
void main_tmr_func() // функция основного таймера
{
if((tacho.getHz() > 100)&&(tacho.getHz() < 290)) // если значение оборотов превысило установленное значение
{
// среагируем на это
}
else // если значение оборотов вернулось в нормальные границы
{
// среагируем на это
}
if((speed.getHz() > 150)&&(speed.getHz() < 350)) // если значение скорости превысило установленное значение
{
// среагируем на это
}
else // если значение скорости вернулось в нормальные границы
{
// среагируем на это
}
}
void setup()
{
attachInterrupt(TACH_PIN, tach_isr, FALLING); // подключаем прерывание для чтения оборотов двигателя
attachInterrupt(SPEED_PIN, speed_isr, FALLING); // подключаем прерывание для чтения скорости автомобиля
main_tmr.attach(&main_tmr_func); // подключаем функцию-обработчик события таймера
}
void loop()
{
main_tmr.tick(); // обработка тиканья главного таймера
}