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.
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:
Ecran LCD 1602 IIC/I2C → afisaj 2 x 16
Buton 1 → setarea dimensiunea rotii
Button 2 → setarea unei distante propuse
Button 3 → afisarea temperaturii ambientale si a presiunii
Button 4 → afisarea coordonatelor accelerometrice
Senzor magnetic Hall
Modul 10DOF MPU9250 și BMP280 → giroscop, accelerometru, presiune, temperatura, magnetometru
LED → se aprinde la atingerea distantei target timp de 2s
Rezistenta → limiteaza curentul din LED
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.
18 mai - documentatie hardware
25 mai - documentatie software
https://www.youtube.com/watch?v=250Lzc0WHIg&list=PLIcgpRPBfC5U9chF8or-npb-BaCgIstxk&index=3
https://www.youtube.com/watch?v=wazPfdGBeZA
https://www.youtube.com/watch?v=mzwovYcozvI