
Интернет-магазин «Неглупый Дом»
Магнит на спице колеса раз за оборот проходит мимо геркона KY-025, закреплённого на вилке — зная длину окружности колеса, Arduino считает скорость и общий пробег на LCD1602.
Геркон (герметичный контакт) — это механический переключатель, который замыкается под действием магнитного поля. KY-025 устроен так же, как в велокомпьютерах с проводным датчиком: небольшой магнит закрепляется на спице колеса, а сам геркон — на неподвижной части вилки так, чтобы магнит при каждом обороте колеса проходил в нескольких миллиметрах от него. Каждое прохождение магнита мимо геркона даёт один импульс замыкания контакта.
Зная длину окружности колеса (расстояние, которое велосипед проезжает за один оборот) и время между двумя последовательными импульсами геркона, легко посчитать мгновенную скорость: окружность, делённая на время одного оборота, даёт пройденное расстояние в единицу времени. А суммируя длину окружности на каждый зафиксированный оборот — получаем общий пройденный путь (одометр).
Важный нюанс в коде — расчёт скорости должен учитывать ситуацию, когда велосипед остановился: если новых импульсов от геркона давно не было, скорость должна показывать 0, а не «зависать» на последнем измеренном значении до следующего оборота колеса.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int reedPin = 2;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const float wheelCircumferenceM = 2.1; // длина окружности колеса, метры — измерьте рулеткой!
volatile unsigned long lastPulse = 0; // время последнего импульса от геркона, мс
volatile unsigned long interval = 0; // интервал между последними двумя импульсами, мс
float totalDistanceKm = 0; // накопленный пробег, км
bool lastState = HIGH;
void setup() {
Serial.begin(9600);
pinMode(reedPin, INPUT);
lcd.init();
lcd.backlight();
}
void loop() {
bool state = digitalRead(reedPin);
if (state == HIGH && lastState == LOW) {
// геркон только что замкнулся — зафиксировали ещё один оборот колеса
unsigned long now = millis();
interval = now - lastPulse;
lastPulse = now;
totalDistanceKm += wheelCircumferenceM / 1000.0;
}
lastState = state;
// если с последнего импульса прошло больше 2 секунд — считаем, что велосипед стоит
float speedKmh = (interval > 0 && millis() - lastPulse < 2000)
? (wheelCircumferenceM / 1000.0) / (interval / 3600000.0) : 0;
lcd.setCursor(0, 0);
lcd.print("Speed: ");
lcd.print(speedKmh);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(totalDistanceKm);
lcd.print("km ");
delay(200);
}
`wheelCircumferenceM` нужно измерить рулеткой по факту (длина окружности колеса) — от этого числа напрямую зависит точность показаний скорости и пробега.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 312 ₽ 281 ₽ (экономия 31 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.