This is an old revision of the document!
Doresc creerea unui pedometru, un aparat ce masoara numarul de pasi pe care ii face o persoana.
Scopul este de a incuraja activitatea fizica
Bateria alimenteaza microcontrolerul. Comunicarea cu accelerometru este de tip analog, iar cu display-ul este 12C.
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)
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 =====