Distance calculator - Dulgheru Elena

Introducere

Proiectul consta in crearea unui dispozitiv de monitorizare pentru mersul pe bicicleta, similar unui smartwatch multifunctional. Device-ul ofera informații despre viteza de deplasare, viteza medie, distanța parcursă, temperatura si date accelerometrice. În plus, utilizatorul poate alege sa-si seteze un obiectiv de distanță pentru a imbunatati performanța si a creste motivatia.

Ideea de la care am pornit in alegerea proiectului a fost cat de necesara este miscarea pentru un programator care isi petrece intreaga zi pe scaun, in fata calculatorului. Am ales sa lucrez la ceva util, ce mi-ar fi de folos atat mie, cat si oricarei persoane cu ritm de viata static, ce incearca sa-si imbunatateasca conditia fizica.

Asemanator unui ceas inteligent, consider ca acest dispozitiv contribuie la mentinerea motivatiei si la un antrenament fizic mai eficient si mai placut.

Descriere generală

O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează.

Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html

Dispozitivul foloseste un display LCD 1602 IIC/I2C pentru afisarea vitezei curenta, vitezei medie si distantei parcurse. Viteza este calculata folosind un senzor de camp magnetic (Hall). Voi avea in plus 4 butoane cu urmatoarele functionalitati:

  1. Alegerea a dimensiunii rotii de bicicleta pentru calculul vitezei si al distantei
  2. Setarea unei distante propuse
  3. Afisarea temperaturii ambientale si a presiunii, folosind Modulul 10DOF MPU9250 și BMP280
  4. Afisarea coordonatelor accelerometrice folosind acelasi modul.

Hardware Design

Lista Piese

  • Arduino Nano
  • Ecran LCD 1602 IIC/I2C
  • 4 butoane push fara retinere, 7mm, 2 pini
  • Rezistor 1k
  • PCB
  • KY-024 Linear magnetic Hall Sensor
  • LED 5mm albastru transparent
  • Fire
  • Modul 10DOF MPU9250 și BMP280
  • Baterie externa 5V

Schema circuitului

Ecran LCD 1602 IIC/I2C → afisaj 2 x 16

  • GND - GND
  • VCC - 5V
  • SDA - A4
  • SCL - A5

Buton 1 → setarea dimensiunea rotii

  • GND - GND
  • OUT - D12

Button 2 → setarea unei distante propuse

  • GND - GND
  • OUT D3

Button 3 → afisarea temperaturii ambientale si a presiunii

  • GND - GND
  • OUT - D8

Button 4 → afisarea coordonatelor accelerometrice

  • GND - GND
  • OUT - D9

Senzor magnetic Hall

  • GND - GND
  • +V - 5V
  • Digital signal - D6

Modul 10DOF MPU9250 și BMP280 → giroscop, accelerometru, presiune, temperatura, magnetometru

  • Vin - 5V
  • GND - GND
  • SCL - A5
  • SDA - A4

LED → se aprinde la atingerea distantei target timp de 2s

  • - - GND
  • + - D7

Rezistenta → limiteaza curentul din LED

Software Design

Codul se poate vizualiza pe GitHub: https://github.com/p96370/Distance_calculator

Descriere generala a codului

Acest proiect are ca scop monitorizarea în timp real a performanței unei biciclete, folosind mai mulți senzori și un afișaj LCD. Sistemul detectează rotațiile roții pentru a calcula viteza, distanța parcursă și viteza medie. În plus, oferă informații despre temperatura și presiunea atmosferică, precum și direcția cardinală bazată pe datele de la un magnetometru. Interacțiunea cu sistemul se face prin intermediul a patru butoane fizice.

Funcția de întrerupere ISR(TIMER1_COMPA_vect)
  Această funcție este apelată automat la fiecare 1 milisecundă, datorită modului CTC al Timerului 1.
  Funcționalitate principală:
  - Citirea senzorului Reed și a butoanelor:
  Se detectează rotațiile roții și stările butoanelor pentru a declanșa acțiuni specifice.
  Gestionarea butoanelor:
  - B1: Comută între trei dimensiuni predefinite ale roții. Se actualizează circumferința și se resetează distanța țintă.
  - B2: Incrementează distanța țintă (target_distance), cu protecție la apăsări multiple (debouncing software).
  - B3: Activează afișarea informațiilor despre temperatură, presiune și direcția cardinală.
  - B4: Activează afișarea valorilor giroscopice și accelerometrice.
  Semnalizarea atingerii distanței țintă:
  - LED-ul se aprinde timp de 2 secunde când distanța parcursă depășește ținta setată.
  Calculul vitezei și distanței:
  - Se detectează o rotație validă printr-un mecanism de debouncing (reed_nr).
  - Viteza curentă este calculată în km/h, distanța totală este actualizată, iar viteza medie este recalculată.
  - Dacă bicicleta stă pe loc (fără rotații >2s), viteza este resetată la zero.
  Diferențiere importantă: 
  - timer_one_rot: măsoară timpul dintre două rotații succesive (pentru calculul vitezei).
  - reed_nr: contor de debouncing pentru a preveni citiri false de la senzorul Reed.
Funcția displayNormal()
  Afișează pe LCD informații standard:
  - Viteza curentă
  - Viteza medie
  - Distanța totală
  - Distanța țintă
  - Dimensiunea roții (afișată temporar dacă aceasta a fost modificată)
 Se asigură acuratețea datelor prin resetarea vitezei medii la schimbarea dimensiunii roții.
Funcția displayInfoScreen()
  Este apelată doar când flag-ul display este activat de apăsarea butonului corespunzător.
  Afișează:
  - Temperatura ambientală
  - Presiunea atmosferică
  - Direcția cardinală (calculată pe baza magnetometrului)
Funcția determinCardinalDirection()
  Transformă unghiul de orientare (heading) într-o direcție cardinală:
  Nord (N), Est (E), Sud (S), Vest (W)
  Împărțirea se face în intervale de 90°.
Funcția updateHeadingReadings()
  Actualizează un vector de medie mobilă cu unghiuri de direcție:
  Calculează un nou heading folosind atan2 pe datele magnetometrului.
  Normalizează unghiurile între 0° și 360°.
  Media obținută este folosită pentru stabilizarea direcției afișate.
Funcția display_Mag_Gyr()
  Afișează pe ecran valorile normalizate ale:
  Giroscopului (GYR)
  Accelerometrului (ACC)
  Este apelată doar când flag-ul displayDirection este activat.
Funcția loop()
  Funcția principală a programului, se execută continuu:
  - Citirea și normalizarea datelor senzorilor:
  - Giroscop, accelerometru, magnetometru, temperatură
  Actualizarea direcției de orientare:
  - Se calculează un heading mediat cu ajutorul updateHeadingReadings().
  Afișarea datelor:
  - În funcție de flag-uri, se afișează fie:
    1. Datele giroscopice/accelerometrice
    2. Informațiile despre temperatură/presiune/direcție
    3. Sau datele standard de ciclism (viteze și distanțe)
  Întârziere controlată:
  - Un delay(500) ajută la stabilizarea afișajului și evitarea suprasolicitării procesorului.

Rezultate Obţinute

Rezultate partiale

Rezultate finale

https://youtube.com/shorts/-awkKflQsKY?feature=share

Concluzii

Proiectul a fost foarte interesant, cu un nivel sporit de dificultate. Initial am avusesem alte intentii pentru functionalitatea proiectului, insa pe parcurs am facut modificari ce m-au fortat sa aprofundez notiunile invatate pe parcursul semestrului. A fost destul de multa munca, insa la final sunt foarte multumita de rezultatul pe care l-am obtinut.

Download

Arhiva ce contine proiectul poate fi descarcata de aici dulgheru_elena_334ca.zip

Jurnal

7 mai - documentatie generala proiect si listarea pieselor

18 mai - documentatie hardware

25 mai - documentatie software

Bibliografie/Resurse

pm/prj2025/fstancu/elena.dulgheru.txt · Last modified: 2025/05/30 10:35 by elena.dulgheru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0