Сообщение от
Chip
Резистор Rl-10К и Rd-1,5К
Vcc +5в
Здравствуйте, подскажите вы случаем не знаете как именно работает вот этот код?
Код:
unsigned long cur_ms = 0; //переменная для отслеживания натикавших миллисекунд с момента пуска МК
unsigned long prev_ms = 0; //переменная для вычисления отрезков времени
int ms = 0; //сам отрезок времени
int m = 0; //пройденное расстояние
int speed = 0; //переменная для хранения скорости
void setup() {
pinMode(20, INPUT); //включаем 20й порт на Ардуино Мега2560 на чтение
digitalWrite(20, HIGH); //включаем подтягивающий резистор
attachInterrupt(3, odom, RISING); //включаем внешнее прерывание
}
void odom() {
m++; //добавляем 1 при каждом срабатывании
}
void loop() {
cur_ms = millis(); //сколько прошло мс с момента включения
ms = cur_ms - prev_ms; //сколько прошло мс с последнего расчета
if (ms > 500) {
prev_ms = cur_ms; //ставим метку когда было срабатывание
speed = m * 3600 / ms; //вычисляем скорость км в час по кол-ву пройденных метров за отрезок времени ms
m = 0; //обнуляем пройденное расстояние
ms=0; //обнуляем отрезок времени
}
}
Через оптопару подключаю компьютерный вентилятор для проверки, выдает какой-то бред. Если вентилятор подключить к приборной панели показывает 80км\ч.
В этом коде ошибка компиляции в строке "sp=(600000.0/(micros() — micros_sp));"
Код:
//********************************************************************
unsigned long micros_sp;
volatile int sz; //счетчик обнуления
volatile int sp; //скорость
//********************************************************************
void setup(){
Serial.begin(115200); //инициализация ком порта
attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса
}
//********************************************************************
void loop(){
Serial.print (sp);
sz = sz — 1;
if (sz == 0){
sp = 0;
}
delay(50);
}
//********************************************************************
void speedometr(){ //измеряем частоту на входе спидометра по прерыванию
sp=(600000.0/(micros() — micros_sp));
micros_sp= micros();
sz = 30;
}
Если вам не сложно разжуйте как это работает, откуда берутся цифры в первом коде "3600" , а во втором "600000.0"