Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2024:ddosaru:cosmin.craciun2612 [2024/05/23 15:48]
cosmin.craciun2612 [Software Design]
pm:prj2024:ddosaru:cosmin.craciun2612 [2024/05/27 01:11] (current)
cosmin.craciun2612 [Hardware Design]
Line 9: Line 9:
 {{:​pm:​prj2024:​ddosaru:​schema_bloc_craciun_cosmin.jpg?​200|}} {{:​pm:​prj2024:​ddosaru:​schema_bloc_craciun_cosmin.jpg?​200|}}
  
-Bateria alimenteaza microcontrolerul. Comunicarea cu accelerometru ​este de tip analog, iar cu display-ul este 12C.+ 
 +Pedometrul masoara numarul de pasi folosindu-se de un accelerometru digital. Acesta salveaza datele pe un card SD pentru a le putea accesa la urmatoarea deschidere si afiseaza datele pe un ecran lcd. Acesta este portabil cu ajutorul unei baterii 9V.Comunicarea cu accelerometru ​si ecranul sunt cu protocolul I2C.
 ===== Hardware Design ===== ===== Hardware Design =====
  
Line 22: Line 23:
   * button   * button
 </​note>​ </​note>​
-{{:​pm:​prj2024:​ddosaru:​craciun_cosmin_sketch_bb.png?​200|}} +{{:​pm:​prj2024:​ddosaru:​craciun_cosmin_sketch_bb.png?​400|}} 
-{{:​pm:​prj2024:​ddosaru:​craciun_cosmin_sketch_schem.png?​200|}} +{{:​pm:​prj2024:​ddosaru:​craciun_cosmin_sketch_schem.png?​500|}} 
-{{:​pm:​prj2024:​ddosaru:​craciun_cosmin_front.jpg?​200|}} +{{:​pm:​prj2024:​ddosaru:​craciun_cosmin_front.jpg?​500|}} 
-{{:​pm:​prj2024:​ddosaru:​craciun_cosmin_back.jpg?​200|}}+{{:​pm:​prj2024:​ddosaru:​craciun_cosmin_back.jpg?​400|}}
 ===== Software Design ===== ===== Software Design =====
    
Line 33: Line 34:
   * mediu de dezvoltare: Visual Studio Code, extensia PlatformIO   * mediu de dezvoltare: Visual Studio Code, extensia PlatformIO
   * librării: Arduino.h, LiquidCrystal_I2C.h,​ Wire.h, TimerOne.h, SD.h   * librării: Arduino.h, LiquidCrystal_I2C.h,​ Wire.h, TimerOne.h, SD.h
 +  * laboratoare:​ I2C, Intreruperi,​ Card SD
 </​note>​ </​note>​
  
-''​ +== Explicarea scheletului proiectului ==
-int ADXL345 ​0x53; // The ADXL345 sensor I2C address ​+
  
- +  * ''​setup()'' ​ 
-float xavg = 0, yavg = 0, zavg = 0; +    ​* Se initializeaza configurația piniilor și initializarea componentelor ​(Ecran LCDcard SDintreruperi,​ accelerometru).  
-float xcur = 0, ycur = 0, zcur = 0; +  ​* ''​writeLCD()''​ 
-float xnxt = 0, ynxt = 0, znxt = 0; +    * afiseaza datele pe ecranul LCDeste apelata atunci cand are loc o schimbare 
-int steps = 0; +  ​* ''​configureADXL345() ​''​ 
-int record = 0; +    ​* ACOnfigureaza accelerometrul,​ apelata in setup 
-int last_steps[3] = {0, 0, 0}; +  ​* ''​ avg()''​ 
-bool start_timer = false; +    * calculeaza pozitia de start a acceleromerului 
-int objectives[11] = {0, 100, 500, 1000, 3000, 5000, 8000}; +  * ''​Timer3s()''​ 
- +    ​* functie apelata de timer o data la 3 secundeSchimba valoarea unui booliar operatiile sunt facute in loop() 
-unsigned long press_time = 0; +  ​* ''​dreadAccelData(float &x, float &y, float &z)''​ 
-bool button_pressed = false; +    * Citeste datele accelerometruluiOfera media a 50 imputuri 
-bool write_sd = false; +  ​* ''​loop()'' ​ 
-bool exist_sd = false; +    ​* Functia principalaCalculul pasilor, verificarea cardului ​SD si verificarea butonului
-int record_beat = 0; +  ​
- +
-int config = 0; +
-int obj = 0; +
-float gravity_vl = 0; +
- +
- +
-LiquidCrystal_I2C lcd(0x27, 20, 4)+
- +
-// Function to write to the LCD +
-void writeLCD() { +
-  lcd.clear();​ +
-  lcd.setCursor(0,​ 0); +
-  if (obj) { +
-    ​lcd.print("S: "); +
-    lcd.print(steps);​ +
-    lcd.print("​ / "); +
-    lcd.print(objectives[obj]);​ +
-  } else { +
-    lcd.print("​Steps:​ "); +
-    lcd.print(steps);​ +
-  } +
-  if ((steps >= objectives[obj] && steps <= objectives[obj] + 3) && objectives[obj]) { +
-    lcd.setCursor(01); +
-    lcd.print("​GOAL REACHED!"​);​ +
-  } else if(record <= steps && record_beat < 3 && exist_sd){ +
-    lcd.setCursor(01)+
-    lcd.print("​NEW RECORD!"​);​ +
-    record_beat ++; +
-  ​+
-  else{ +
-    lcd.setCursor(0, 1); +
-    ​lcd.print(steps ​0.762); +
-    lcd.print("​ m"); +
-  } +
-  if(!exist_sd){ +
-    lcd.setCursor(111); +
-    lcd.print("​no SD"); +
-  ​+
-+
- +
-void configureADXL345() ​{ +
-  ​Wire.beginTransmission(ADXL345);​ +
-  Wire.write(0x2D);​ // Access/ talk to POWER_CTL Register - 0x2D +
-  Wire.write(8); ​   // Enable measurement (D3 bit high) +
-  ​Wire.endTransmission()+
-  delay(10);​ +
-+
- +
-void gravity() { +
-  xavg = yavg = zavg = 0; // Initialize averages +
-  for (int i = 0; i < 50; i++) { +
-    ​Wire.beginTransmission(0x53);​ +
-    Wire.write(0x32);​ +
-    Wire.endTransmission();​ +
-    Wire.requestFrom(0x53,​ 6); // Request 6 bytes of data +
- +
-    byte data[6]; +
-    for (int j = 0; j < 6; j++) { +
-      data[j] = Wire.read();​ +
-    } +
- +
-    int16_t x = (data[1] << 8) | data[0]; +
-    int16_t y = (data[3] << 8) | data[2]; +
-    int16_t z = (data[5] << 8) | data[4]; +
- +
-    xavg += x 0.004; +
-    yavg += y * 0.004; +
-    zavg += z * 0.004; +
-  ​+
-  xavg /= 50; +
-  yavg /= 50; +
-  zavg /= 50; +
- +
-  gravity_vl = sqrt(xavg ​xavg + yavg * yavg + zavg * zavg); +
-+
- +
-void Timer2s() +
-  write_sd = true; +
-+
- +
-void setup() { +
-  Serial.begin(9600);​ +
-  lcd.init();​ +
-  lcd.backlight();​ +
-  lcd.setCursor(2,​ 0); +
-  lcd.print("​Step Counter"​);​ +
-  Serial.println("​LCD configured"​);​ +
-  configureADXL345();​ // Configure the sensor +
-  Serial.println("​ADXL345 configured"​);​ +
-  pinMode(8, INPUT_PULLUP);​ +
-  Serial.println("​Button configured"​);​ +
- +
-  if(!SD.begin(4)){ +
-    ​Serial.println("​SD card failed to initialize"​);​ +
-  } +
-  else{ +
-    exist_sd = true; +
-    Serial.println("​SD card initialized"​);​ +
-    if(SD.exists("​steps.txt"​)) { +
-      File file = SD.open("​steps.txt"​FILE_READ);​ +
-      if(file)+
-        steps = file.parseInt();​ +
-        obj = file.parseInt();​ +
-        record = file.parseInt();​ +
-        last_steps[0] = file.parseInt();​ +
-        last_steps[1] = file.parseInt();​ +
-        last_steps[2] = file.parseInt();​ +
-        file.close();​ +
-      } +
-      else{ +
-        Serial.println("​File not found"​);​ +
-      } +
-    } +
-    else{ +
-      Serial.println("​File not found"​);​ +
-      record_beat = 3; +
-    } +
-    int i = 0; +
-    objectives[7] = record; +
-    while(i < 4 && last_steps[i] != 0){ +
-      objectives[8 + i] = last_steps[i];​ +
-      i++; +
-    } +
- +
-    Timer1.initialize(2000000);​ // 2s +
-    Timer1.attachInterrupt(Timer2s);​ +
-  ​+
- +
-  gravity();​ +
-+
- +
-void readAccelData(float &x, float &y, float &​z) ​+
-  x = y = z = 0; +
-  for (int i = 0; i < 50; i++) { +
-    ​Wire.beginTransmission(0x53);​ +
-    Wire.write(0x32);​ +
-    Wire.endTransmission();​ +
-    Wire.requestFrom(0x53,​ 6); // Request 6 bytes of data +
- +
-    byte data[6]; +
-    for (int j = 0; j < 6; j++) { +
-      data[j] = Wire.read();​ +
-    } +
- +
-    int16_t x_val = (data[1] << 8) | data[0]; +
-    int16_t y_val = (data[3] << 8) | data[2]; +
-    int16_t z_val = (data[5] << 8) | data[4]; +
- +
-    x += x_val 0.004; +
-    y += y_val * 0.004; +
-    z += z_val * 0.004; +
-  } +
-  x /= 50; +
-  ​y /= 50; +
-  z /= 50; +
-+
- +
-void loop() ​+
-  if (write_sd){ +
-    ​SD.remove("​steps.txt"​);​ +
-    File File_write = SD.open("​steps.txt",​ FILE_WRITE);​ +
-    if(File_write && steps > 10){ +
-      File_write.println(steps);​ +
-      File_write.println(obj);​ +
-      File_write.println(record);​ +
-      File_write.println(last_steps[0]);​ +
-      File_write.println(last_steps[1]);​ +
-      File_write.println(last_steps[2]);​ +
-      File_write.close();​ +
-    } +
-    write_sd = false; +
-  ​+
-  // Handle button press +
-  int buttonState = digitalRead(8);​ // Read the state of the button +
-  if (buttonState == LOW && !button_pressed) { // Button pressed +
-    press_time = millis(); +
-    button_pressed = true; +
-  } else if (buttonState == HIGH && button_pressed) { // Button released +
-    unsigned long duration = millis() - press_time;​ +
-    if (duration > 2000) { +
-      if(steps > 10) { +
-        last_steps[2] = last_steps[1];​ +
-        last_steps[1] = last_steps[0];​ +
-        last_steps[0] = steps; +
-      } +
-      steps = 0; +
- +
-    } else if (duration > 80) { +
-      obj++; +
-      obj = obj % 7; +
-    } +
-    writeLCD();​ +
-    button_pressed = false; +
-  } +
- +
-  readAccelData(xcur,​ ycur, zcur); +
-  float acc = sqrt(xcur * xcur + ycur * ycur + zcur * zcur); +
-  acc = acc - gravity_vl;​ +
- +
-  for(int i = 0; i < 50; i ++){ +
-    int buttonState = digitalRead(8);​ // Read the state of the button +
-    if (buttonState == LOW && !button_pressed) { // Button pressed +
-      press_time = millis(); +
-      button_pressed = true; +
-    } else if (buttonState == HIGH && button_pressed) { // Button released +
-      unsigned long duration = millis() - press_time;​ +
-      if (duration > 2000) { +
-        steps = 0; +
-      } else if (duration > 80) { +
-        obj++; +
-        obj = obj % 7; +
-      } +
-      writeLCD();​ +
-      button_pressed = false; +
-    } +
-    delay(10);​ +
-  } +
- +
-  readAccelData(xnxt,​ ynxt, znxt); +
-  float acc2 = sqrt(xnxt * xnxt + ynxt * ynxt + znxt * znxt); +
-  acc2 = acc2 - gravity_vl;​ +
- +
-  if (acc2 - acc > 0.12) { +
-    steps = steps + 1; +
-    if(steps > record){ +
-      record = steps; +
-      objectives[7] = record; +
-    } +
-    writeLCD();​ +
-  } +
-}''​+
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
    
-<note tip> +<html
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +<iframe width="​560"​ height="​315"​ src="​https://​www.youtube.com/​embed/​s27g4Crmi9g?​si=3Dkt6WCnm00SNoin"​ title="​YouTube video player"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; clipboard-write;​ encrypted-media;​ gyroscope; picture-in-picture;​ web-share"​ referrerpolicy="​strict-origin-when-cross-origin"​ allowfullscreen></​iframe>​ 
-</note> +</​html>​ 
-  +
-===== Concluzii ===== +
- +
 ===== Download ===== ===== Download =====
    
-<note warning>​ +{{:pm:prj2024:ddosaru:proiect_craciun_cosmin.zip|}}
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). +
-  +
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:​prj20??:​c?:​nume_student** (dacă este cazul). **Exemplu:​** Dumitru Alin, 331CC -> **:​pm:​prj2022:​cc:​dumitru_alin**. +
-</​note>​ +
-  +
-===== Jurnal ===== +
-  +
-<note tip> +
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. +
-</​note>​+
    
 +
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
    
pm/prj2024/ddosaru/cosmin.craciun2612.1716468497.txt.gz · Last modified: 2024/05/23 15:48 by cosmin.craciun2612
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