#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <LiquidCrystal_I2C.h>
// Network and server settings
const char* ssid = "Wokwi-GUEST";
const char* password = ""; // No password required for Wokwi-GUEST
const char* host = "10.10.0.2"; // Public Gateway IP, adjust if necessary
const uint16_t port = 8080;
// Hardware settings
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD at I2C address 0x27
Adafruit_MPU6050 mpu; // MPU6050 accelerometer
const int buttonPin = 8; // Button pin to toggle logging
volatile bool isLogging = false; // Logging state
String dataBuffer = ""; // Buffer to store data for batch sending
WiFiClient client; // WiFi client for data transmission
void setup() {
Serial.begin(115200);
pinMode(buttonPin, INPUT_PULLUP); // Setup button with internal pull-up
Wire.begin();
lcd.init(); // Initialize the LCD
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
if (!mpu.begin()) { // Initialize MPU6050
lcd.clear();
lcd.print("MPU init failed");
while (1); // Halt if MPU6050 not connected properly
}
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
connectToWiFi();
lcd.clear();
lcd.print("Ready to log");
}
void loop() {
handleButton();
if (isLogging) {
logData();
}
}
void handleButton() {
static bool lastButtonState = LOW;
bool currentButtonState = digitalRead(buttonPin);
if (currentButtonState != lastButtonState) {
delay(50); // Debounce delay
if (currentButtonState == HIGH) {
toggleLogging();
}
lastButtonState = currentButtonState;
}
}
void toggleLogging() {
isLogging = !isLogging;
lcd.clear();
if (isLogging) {
dataBuffer = ""; // Clear buffer on start
lcd.print("Logging...");
} else {
lcd.print("Saving...");
sendBatchData();
lcd.clear();
lcd.print("Data Sent");
delay(2000);
lcd.clear();
lcd.print("Ready to log");
}
}
void logData() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
char data[100];
snprintf(data, sizeof(data), "X:%.4f Y:%.4f Z:%.4f\n", a.acceleration.x, a.acceleration.y, a.acceleration.z);
dataBuffer += String(data);
}
void sendBatchData() {
if (!client.connect(host, port)) {
lcd.setCursor(0, 1);
lcd.print("Conn failed");
Serial.println("Failed to connect to server.");
} else {
client.print(dataBuffer);
client.stop();
Serial.println("Data sent and connection closed.");
}
}
void connectToWiFi() {
lcd.setCursor(0, 1);
lcd.print("Connecting WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
lcd.setCursor(0, 1);
lcd.print("WiFi OK");
}