#include <Wire.h>
float AccX,AccY,AccZ;
float AngleRoll,AnglePitch;
#define buzzerPin 33
//float pitchThreshold=20;
#define ledPin 12
void gyro_signals(void){
Wire.beginTransmission(0x68);
Wire.write(0x1C);// digital high pass filter
Wire.write(0x10);// configure the accelerometer output (8g) hexadecimal value of 16 decimal value of 1t6 4096lsb
Wire.endTransmission();
Wire.beginTransmission(0x68);
Wire.write(0x3B);
Wire.endTransmission();
Wire.requestFrom(0x68,6);
int16_t AccXLSB=Wire.read()<<8 | Wire.read();
int16_t AccYLSB=Wire.read()<<8 | Wire.read();
int16_t AccZLSB=Wire.read()<<8| Wire.read();
AccX=(float)AccXLSB/4096;
AccY=(float)AccYLSB/4096;
AccZ=(float)AccZLSB/4096;
AngleRoll=atan(AccY/sqrt(AccX*AccX+AccZ*AccZ))*1/(3.14/180);
AnglePitch=-atan(AccX/sqrt(AccY*AccY+AccZ*AccZ))*1/(3.14/180);
}
void setup() {
Serial.begin(57600);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
Wire.setClock(400000);
Wire.begin();
delay(250);
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission();
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
gyro_signals();
Serial.print("acceleration along x [°/s]= ");
Serial.println(AccX);
Serial.print("acceleration along y [°/s]= ");
Serial.println(AccY);
Serial.print("accleratiopn along Z [°/s]= ");
Serial.println(AccZ);
Serial.print("Rolll Angle [°/s]= ");
Serial.println(AngleRoll);
Serial.print("pitch angle [°/s]= ");
Serial.println(abs(AnglePitch));
if(abs(AnglePitch) > 35){
tone(buzzerPin,15000,500);
digitalWrite(ledPin, HIGH);
Serial.println("VERY BAD POSTURE");
}
else if(abs(AnglePitch) > 20 && abs(AnglePitch) <= 35){
tone(buzzerPin,10000,500);
digitalWrite(ledPin, HIGH);
Serial.println("BAD POSTURE");
}
else if(abs(AnglePitch) > 10 && abs(AnglePitch) <= 20){
tone(buzzerPin,5000,500);
digitalWrite(ledPin, HIGH);
Serial.println("Moderately BAD POSTURE");
}
else {
noTone(buzzerPin);
digitalWrite(ledPin, LOW);
Serial.println("GOOD POSTURE");
}
delay(1000);
}