Велокомпьютер

zidi85
Offline
Зарегистрирован: 10.01.2016

Здравствуйте уважаемые гуру и только начинающие.

Чувствую, что задача смешная, но всё же спрошу, потому что запутался.

Идея простая: сделать очередной велокомпьютер из arduino. Подсчёт оборотов решил делать с помощью датчика Холла a3144. В коде, на данный момент, удаётся вести подсчёт количества оборотов колеса.

unsigned long NewMileage = 0;
unsigned long NumberOfCircles = 0;
// считаю количество оборотов колеса
void rpm(){
  NumberOfCircles++;
  NewMileage=NumberOfCircles;
}
void setup() {
// фиксирую только переход датчика А3144 с HIGH на LOW, то есть 
// когда поблизости магнит, то сигнал становится LOW
attachInterrupt(0, rpm, FALLING);
Serial.begin(9600);
}
void loop() {
Serial.println(NewMileage);
}
 

Общее пройденное расстояние легко подсчитать просто умножив количество оборотов колеса за всё время поездки на длину окружности колеса. Но как быть с подсчётом скорости (v=S/t) Даже если принять, что согласен считать количество оборотов колеса за 1 секунду, то количество оборотов мне известно общее за всю велопрогулку, а не за одну прошедшую секунду.

Наставьте на путь истинный, пожалуйста. Как знать текущую скорость езды ?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

считай v = S / t , где S - длина обода колеса, а t - время между кликами датчика

zidi85
Offline
Зарегистрирован: 10.01.2016

Спасибо за ответ. Эту формулу я написал в первом посте ветки, проблема у меня как раз подсчёте времени оборота, ну или количества оборотов за определённый промежуток времени(что считаю менее удачныи решением). Никак не соображу как это делать. Уже начал читать про millis, про таймер в arduino, но просветление пока так и не пришло. 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
Serial.println(StopWatch_01.interval);

ок. класс титановый велосипед StopWatch.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

zidi85 пишет:

Никак не соображу как это делать. Уже начал читать про millis, про таймер в arduino, но просветление пока так и не пришло. 

Читать - это хорошо, но лучше бу начать с учебника по программированию. Мало пользы в изучении дорожных знаков, если Вы понятия не имеете, для чего в автомобиле руль и педали и как ими пользоваться.

Ну а по поводу "сообразить" - просто представьте, как бы Вы сами стали решать эту задачу, если бы на месте контроллера были лично Вы. Смогли бы Вы, располагая счетчиком оборотов и часами, вычислить скорость движения?

zidi85
Offline
Зарегистрирован: 10.01.2016

Спасибо всем отозвавшимся. Накидал я тут код, вроде бы даже считает и расстояние и скорость.

Уважаемые гуру, взгляните на него пожалуйста, всё ли верно:

#include <TimerOne.h>

// окружность колеса в метрах
static float circle = 2.09;

volatile long int NumberOfCircles = 0;
volatile long int oldNumberOfCircles = 0;
volatile float speed = 0;

void setup() {
attachInterrupt(0, rpm, FALLING);
Timer1.initialize(4000000);
Timer1.attachInterrupt(Calcspeed);

Serial.begin(9600);
}


void loop() {
Serial.print("Distance: ");
Serial.print(NumberOfCircles*circle);
Serial.println(" m");

  Serial.println(NumberOfCircles);
  Serial.print("   ");
  Serial.print(speed);
  Serial.println("m/s");  

Serial.print("   ");
Serial.print(speed*3.6);
Serial.println("Km/h");
}

void rpm(){
  NumberOfCircles++;
}

void Calcspeed(){
speed = float(((NumberOfCircles - oldNumberOfCircles)/4)*circle);
  oldNumberOfCircles = NumberOfCircles;
}

 

zidi85
Offline
Зарегистрирован: 10.01.2016

Никто не может проверить код на логичность ?

Это основной функционал, не хочется делать базис с ошибками.

Заранее спасибо.