This shows you the differences between two versions of the page.
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 LCD, card SD, intreruperi, accelerometru). |
- | float xcur = 0, ycur = 0, zcur = 0; | + | * ''writeLCD()'' |
- | float xnxt = 0, ynxt = 0, znxt = 0; | + | * afiseaza datele pe ecranul LCD, este 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 secunde. Schimba valoarea unui bool, iar operatiile sunt facute in loop() | |
- | unsigned long press_time = 0; | + | * ''dreadAccelData(float &x, float &y, float &z)'' |
- | bool button_pressed = false; | + | * Citeste datele accelerometrului. Ofera media a 50 imputuri |
- | bool write_sd = false; | + | * ''loop()'' |
- | bool exist_sd = false; | + | * Functia principala. Calculul 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(0, 1); | + | |
- | lcd.print("GOAL REACHED!"); | + | |
- | } else if(record <= steps && record_beat < 3 && exist_sd){ | + | |
- | lcd.setCursor(0, 1); | + | |
- | lcd.print("NEW RECORD!"); | + | |
- | record_beat ++; | + | |
- | } | + | |
- | else{ | + | |
- | lcd.setCursor(0, 1); | + | |
- | lcd.print(steps * 0.762); | + | |
- | lcd.print(" m"); | + | |
- | } | + | |
- | if(!exist_sd){ | + | |
- | lcd.setCursor(11, 1); | + | |
- | 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 ===== | ||