#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <DHT.h>
#include <WiFi.h>
#include <HTTPClient.h>
// Pin Definitions
#define TRIG_PIN 5
#define ECHO_PIN 18
#define DHT_PIN 12 // DHT22 data pin on GPIO 12
#define SDA_PIN 21 // I2C SDA pin for MPU6050
#define SCL_PIN 22 // I2C SCL pin for MPU6050
#define DHTTYPE DHT22 // DHT sensor type
// WiFi credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
const char* webAppUrl = "https://script.google.com/macros/s/YourGoogleAppsScriptID/exec"; // Replace with your Google Apps Script URL
DHT dht(DHT_PIN, DHTTYPE);
Adafruit_MPU6050 mpu;
void setup() {
// Serial Monitor setup
Serial.begin(115200);
Serial.println("Hello, ESP32!");
// Pin mode setup
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// WiFi connection
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// DHT sensor setup
dht.begin();
// Initialize I2C communication with custom SDA and SCL pins
Wire.begin(SDA_PIN, SCL_PIN);
// Try to initialize the MPU6050 sensor
if (!mpu.begin()) {
Serial.println("MPU6050 not connected!");
while (1) {
delay(1000); // Wait for 1 second before retrying
}
}
Serial.println("MPU6050 ready!");
}
void loop() {
// Measure distance
float distance = measureDistance();
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Measure temperature and humidity
float temperature = readTemperatureWithRetry();
float humidity = readHumidityWithRetry();
// Print temperature and humidity
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
// Read accelerometer values
sensors_event_t event;
mpu.getAccelerometerSensor()->getEvent(&event);
float accelX = event.acceleration.x;
float accelY = event.acceleration.y;
float accelZ = event.acceleration.z;
// Print accelerometer values
Serial.print("Accel X: ");
Serial.print(accelX);
Serial.println(" m/s^2");
Serial.print("Accel Y: ");
Serial.print(accelY);
Serial.println(" m/s^2");
Serial.print("Accel Z: ");
Serial.print(accelZ);
Serial.println(" m/s^2");
// Send data to Google Apps Script
sendDataToGoogleAppsScript(distance, temperature, humidity, accelX, accelY, accelZ);
// Delay before next measurement
delay(5000); // 5 seconds delay
}
float measureDistance() {
// Send ultrasonic pulse
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Measure the duration of the echo signal
long duration = pulseIn(ECHO_PIN, HIGH);
// Calculate distance in centimeters
float distance = duration * 0.0343 / 2;
return distance;
}
float readTemperatureWithRetry() {
float temperature = NAN;
for (int i = 0; i < 3; ++i) {
temperature = dht.readTemperature();
if (!isnan(temperature)) {
break;
}
delay(2000);
}
if (isnan(temperature)) {
Serial.println("Failed to read temperature from DHT sensor!");
}
return temperature;
}
float readHumidityWithRetry() {
float humidity = NAN;
for (int i = 0; i < 3; ++i) {
humidity = dht.readHumidity();
if (!isnan(humidity)) {
break;
}
delay(2000);
}
if (isnan(humidity)) {
Serial.println("Failed to read humidity from DHT sensor!");
}
return humidity;
}
void sendDataToGoogleAppsScript(float distance, float temperature, float humidity, float accelX, float accelY, float accelZ) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(webAppUrl) + "?distance=" + distance + "&temperature=" + temperature + "&humidity=" + humidity + "&accelX=" + accelX + "&accelY=" + accelY + "&accelZ=" + accelZ;
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println(httpResponseCode);
Serial.println(response);
} else {
Serial.print("Error on sending GET: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi not connected");
}
}