#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht (DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
Adafruit_MPU6050 mpu;
sensors_event_t event;
float previousZ, Temp, Humidity = 0;
int steps = 0;
const float threshold = 1.0;
void setup() {
Serial.begin(9600);
Serial.println("Fitness System");
Serial.println("This System can do the following for Athelets:");
Serial.println("1- Measure Temperature and Humidity");
Serial.println("2- Pedometer to Count Steps");
Serial.println("######################");
lcd.begin(20, 4);
dht.begin();
mpu.begin();
StepsSetup();
TempAndHumiditySetup();
}
void loop() {
MeasureTempAndHumidity();
StepsCounter();
}
void MeasureTempAndHumidity() {
float t = dht.readTemperature();
float h = dht.readHumidity();
// if Temp or Humidity changes we print new results.
if (Temp != t || Humidity != h) {
Serial.println("Updates In Temp or Humidity");
Serial.print("Temp= "); Serial.print(t); Serial.println(" C");
Serial.print("Humidity= "); Serial.print(h); Serial.println(" %");
lcd.setCursor(0, 2);
lcd.print("Temp="); lcd.print(t); lcd.println("C");
lcd.setCursor(0, 3);
lcd.print("Humidity="); lcd.print(h); lcd.println(" %");
Serial.println("######################");
Temp = t;
Humidity = h;
}
}
void TempAndHumiditySetup() {
Temp = dht.readTemperature();
Humidity = dht.readHumidity();
Serial.print("Temp= "); Serial.print(Temp); Serial.println(" C");
Serial.print("Humidity= "); Serial.print(Humidity); Serial.println(" %");
lcd.setCursor(0, 2);
lcd.println("Temp="); lcd.print(Temp); lcd.println(" C");
lcd.setCursor(0, 3);
lcd.println("Humidity="); lcd.print(Humidity); lcd.println(" %");
}
void StepsSetup() {
while (!mpu.begin()) {
Serial.println("MPU6050 not connected!");
delay(1000);
}
Serial.println("MPU6050 ready!");
Serial.print("Steps= "); Serial.println(steps);
lcd.setCursor(0, 1);
lcd.print("Steps= "); lcd.print(steps);
}
void StepsCounter() {
mpu.getAccelerometerSensor()->getEvent(&event);
float currentZ = event.acceleration.z;
// Simple peak detection
if (previousZ < threshold && currentZ >= threshold) {
steps++;
Serial.print("Step detected! Total steps: ");
Serial.println(steps);
lcd.setCursor(0, 1);
lcd.println("Steps="); lcd.print(steps);
}
previousZ = currentZ;
}