// Nama : Adi Suprasetyo
// NIM : 5200411205 
// kelas : VII 



#include <WiFi.h>
#include <WiFiClient.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include "ThingSpeak.h"

WiFiClient client;

String thingSpeakAddress = "api.thingspeak.com";
String writeAPIKey;
String tsfield1Name;
String request_string;

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);


Adafruit_MPU6050 mpu;

void setup()
{
  Serial.begin(115200);
  // Koneksi Wifi
  WiFi.disconnect();
  WiFi.begin("Wokwi-GUEST", "");
  while ((!(WiFi.status() == WL_CONNECTED))) {
    delay(300);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  //koneksi mpu6050
  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }
  mpu.setAccelerometerRange(MPU6050_RANGE_16_G);
  mpu.setGyroRange(MPU6050_RANGE_250_DEG);
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.println("");
  delay(100);
  lcd.init();
  lcd.backlight();
}

//inisilisai nilai sensor
double x,y,z ;
double xg,yg,zg;
int t;


void loop()
{
  mpu6050();
  kirim_thingspeak(x,y,z,xg,yg,zg,t);
}

void mpu6050(){
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  //Acceleration
  x = a.acceleration.x;
  y = a.acceleration.y;
  z = a.acceleration.z;

// Gyroscope
  xg = g.gyro.x;
  yg = g.gyro.y;
  zg = g.gyro.y;

  t = temp.temperature;

  //Aman coy No gwmpa
  if ((x==0)and (y==0)){
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("Aman Tidak Terjadi");
    lcd.setCursor(7, 2);
    lcd.print("GEMPA");
    Serial.print("Aman : ");
    Serial.print(x);
    Serial.print(",");
    Serial.print(y);
    Serial.print(",");
    Serial.print(z);
    Serial.print(", ");
    delay(1000);
  }
  //Terjadi Gempa
  else{
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("Gawat terjadi Gempa");
    Serial.println("Gempa NIH CUYYYY ");
    //Acceleration
    Serial.println("Acceleration : ");
    Serial.print(" X: ");
    Serial.print(x);
    Serial.print(", Y: ");
    Serial.print(y);
    Serial.print(", Z: ");
    Serial.print(z);
    Serial.println(" m/s^2");
    //Rotation
    Serial.println("Rotation : ");
    Serial.print(" X: ");
    Serial.print(xg);
    Serial.print(", Y: ");
    Serial.print(yg);
    Serial.print(", Z: ");
    Serial.print(zg);
    //Temperature
    Serial.println("Temperature");
    Serial.print("Temp :");
    Serial.print(t);
    Serial.println(" degC");
    delay(1000);
  }
  
}

void kirim_thingspeak(double x, double y,double z,double xg, double yg,double zg,double t) {
  if (client.connect("api.thingspeak.com", 80)) {
    request_string = "/update?";
    request_string += "key=";
    request_string += "NKQNEJM5GY0Q3S8U";
    request_string += "&";
    request_string += "field1";
    request_string += "=";
    request_string += x;
    request_string += "&";
    request_string += "field2";
    request_string += "=";
    request_string += y;
    request_string += "&";
    request_string += "field3";
    request_string += "=";
    request_string += z;

    request_string += "&";
    request_string += "field4";
    request_string += "=";
    request_string += xg;
    request_string += "&";
    request_string += "field5";
    request_string += "=";
    request_string += yg;
    request_string += "&";
    request_string += "field6";
    request_string += "=";
    request_string += zg;

    request_string += "&";
    request_string += "field7";
    request_string += "=";
    request_string += t;
  

    Serial.println(String("GET ") + request_string + " HTTP/1.1\r\n" +
                 "Host: " + thingSpeakAddress + "\r\n" +
                 "Connection: close\r\n\r\n");
                 
    client.print(String("GET ") + request_string + " HTTP/1.1\r\n" +
                 "Host: " + thingSpeakAddress + "\r\n" +
                 "Connection: close\r\n\r\n");
    unsigned long timeout = millis();
    while (client.available() == 0) {
      if (millis() - timeout > 5000) {
        Serial.println(">>> Client Timeout !");
        client.stop();
        return;
      }
    }

    while (client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }

    Serial.println();
    Serial.println("closing connection");

  }
}