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