This is an old revision of the document!


Craciun Cosmin: Pedometru

Introducere

Doresc creerea unui pedometru, un aparat ce masoara numarul de pasi pe care ii face o persoana.

 Scopul este de a incuraja activitatea fizica

Descriere generală

Bateria alimenteaza microcontrolerul. Comunicarea cu accelerometru este de tip analog, iar cu display-ul este 12C.

Hardware Design

Componente utilizate:

  • atmega328p microcontroller board
  • 12c 1602 led interface
  • 1602 led with blue blacklight
  • adxl345 accelerometer
  • 9v battery
  • micro sd module
  • button

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare: Visual Studio Code, extensia PlatformIO
  • librării: Arduino.h, LiquidCrystal_I2C.h, Wire.h, TimerOne.h, SD.h

int ADXL345 = 0x53; The ADXL345 sensor I2C address float xavg = 0, yavg = 0, zavg = 0; float xcur = 0, ycur = 0, zcur = 0; float xnxt = 0, ynxt = 0, znxt = 0; int steps = 0; int record = 0; int last_steps[3] = {0, 0, 0}; bool start_timer = false; int objectives[11] = {0, 100, 500, 1000, 3000, 5000, 8000}; unsigned long press_time = 0; bool button_pressed = false; bool write_sd = false; bool exist_sd = false; 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 1)

1) 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 =====

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

===== Concluzii ===== ===== Download =====

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.

===== Jurnal =====

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

===== Bibliografie/Resurse =====

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF
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