Я тут пытался найти исходники корректора спидометра в интернете. В итоге сделал все сам, ибо нету. Нашел только исходник спидометра и применил его в своём проекте. Транзистор я применил какой валялся в ящике - kc238b, кажется это аналог обычного кт315, точно не помню.
3 цифровой pin на ARDUINO это сигнал с датчика скорости (у меня на бусе применен датчик фаз от 8 клапанного ВАЗ)
4 цифровой pin на ARDUINO это выход на стрелочный спидометр.
Спидометр я применил от УАЗ. Он дешевый и его легко встроить в нашу приборку вместо родного тросового.
A0 - аналоговый вход, сюда подключается потенциометр для регулировки. Можно любой.
Я применил 3,3kOm (контакты слева направо GND/СИГНАЛ/+5V)
Исходник:
Код: Выделить всё
//********************************************************************
volatile unsigned long micros_sp = 0;
volatile byte sz = 0; //счетчик обнуления
volatile unsigned int sp = 0; //скорость
volatile unsigned int InputHz = 0;
volatile unsigned int OutputHz = 0;
double popravka = 0;
volatile boolean st = false; //триггер
unsigned long timing;
unsigned long timing2;
int Vixod=4;
#define PIN_POT A0
unsigned long Period;
unsigned long sp2;
unsigned long Skvajnost;
bool Status=0;
int rotat;
//********************************************************************
void setup(){
Serial.begin(115200); //инициализация ком порта
attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса
pinMode(PIN_POT, INPUT);
pinMode (Vixod, OUTPUT);
}
//********************************************************************
void loop(){
if (millis() - timing > 50)
{
timing = millis();
if (sz != 0){sz--;}else{sp = 0;};
InputHz=sp;
popravka=map(analogRead(PIN_POT),0,1023,0,200)*0.01;
//Period=6000; // тестовый меандр
OutputHz=InputHz*popravka;
Period=600000/OutputHz;
sp2=600000/Period;
Serial.println ((String)OutputHz+" Hz x"+(String)popravka);
Serial.println ((String)sp+"km/h");
Serial.println ((String)sp2);
}
Skvajnost= Period/2 ; // такая скважность называется меандр
if (Status==0) {
if ( (micros()-timing2)>= Skvajnost) {
timing2 = micros();
digitalWrite(Vixod, HIGH);
Status=1;
}
}
if (Status==1) {
if ( (micros()-timing2)>= (Period-Skvajnost) ){
timing2 = micros();
digitalWrite(Vixod, LOW);
Status=0;
}
}
}
//********************************************************************
void speedometr(){ //измеряем частоту на входе спидометра по прерыванию
if(!st){micros_sp = micros();}
else {sp = (600000/(micros() - micros_sp));}
st = !st;
sz = 30;
}
Отправлено спустя 3 минуты 33 секунды:
Только вместо Hz в прошивке км/ч . При 100hz показания равны 60км/ч
название переменных подправлю потом для феньшуя.
Все и так работает.