Najszybszy projekt na świecie

Mimo lata to był nieprzyjemny dzień. Było zimno i padało. To nie jest idealna pogoda na bieganie. A ja uwielbiam biegać. W tym miesiącu zrobiłem tak pewnie już ponad 200 km.

Trzeba się czymś zająć. Obok był orbitrek, dzięki któremu utrzymuje formę zimą. Niestety ma zepsuty licznik. Nie wiem czemu, ale lubię doglądać swoich osiągnięć. Szybkość i dystans mnie motywują.

Do czasu na bieganie pozostało 15 minut, a ja postanowiłem, że odbuduje licznik przy pomocy Arduino.

W tego typu maszynach przebyty dystans oblicza się za pomocą liczby obrotów korby pedałów. Czujnikiem jest kontaktron. To taki włącznik, który przewodzi prąd, gdy zbliży się do niego magnes. Na kole jest magnes, a gdzieś do ramy obok przytwierdzony jest kontaktron.

Jeden impuls kontaktronu to jeden obrót pedałami orbitreka, czyli 2 kroki.

Czujnik podłączyłem do Arduino między cyfrowy pin 2 i GND.
Takie wejście ustawiasz w programie jako:

pinMode(2, INPUT_PULLUP);

Wtedy gdy czujnik nie przewodzi prądu, na wejściu jest poziom HIGH. Gdy magnes zbliży się do czujnika, na wejściu pojawi się poziom LOW.
Poziom wejścia czujnika badasz za pomocą:

byte level = digitalRead(2);

W zmiennej “level” będzie pojawiała się wartość LOW albo HIGH.

Podczas spacerów z GPS ustaliłem, że przejście 10 m zabiera mi około 12 do 14 kroków. Przebiegnięcie 100 m to jakieś 66 kroków, ale tego wyniku nie jestem pewny, bo pomiar robiłem tylko raz.

Dla jednego kroku chodu, wychodzi około:

10 m / 13 kroków = 76 cm/krok

Ponieważ jeden impuls to 2 kroki – wychodzi 1,52 metra/impuls

Biegania nie jestem pewny, ale wyszło 3,03 metra na impuls.

Skoro mam już dane, przyszedł czas na napisanie programu.

word steps;
byte state;

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(2) == LOW && state == HIGH)
  {
    digitalWrite(13, HIGH);
    steps++;
    state = LOW;
    onStep();
  }
  
  else if (digitalRead(2) == HIGH)
  {
    digitalWrite(13, LOW);
    state = HIGH;
  }
}

void onStep()
{
  Serial.print(F("Steps: "));
  Serial.print(steps * 2);
  Serial.print(F(" "));
  Serial.print(F("Distance: "));
  float distance = 3.03 * steps;
  Serial.print(distance/1000.0, 3);
  Serial.println(F(" km "));
}

Funkcja “loop” uruchamiana jest kilkaset tysięcy razy na sekundę. Gdy warunek “if” wykryje impuls, może go odczytać przy każdym uruchomieniu “loop” jako kolejny krok i za jednym obrotem zaliczy nam 1000 kroków. Dlatego po wykryciu kroku trzeba zapamiętać, że już jest zaliczony i poczekać na zmianę poziomu czujnika na HIGH. Tym zajmuje się zmienna “state”.

Zmienna “steps” zlicza obroty korby czyli podwójne kroki.

Ponieważ miałem tylko 15 minut program wyświetla dane jedynie w Monitorze portu szeregowego. Pokazuje liczbę kroków i przebytą odległość. Sam możesz go rozwinąć bardziej o obsługę wyświetlacza LCD, Bluetooth i telefonu/tabletu, albo ładniejszy interfejs użytkownika na ekranie laptopa. Nad tym ostatnim od jakiegoś czasu pracuję. Szczegóły wkrótce.

sprae

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.