#include <WiFi.h> // Library untuk Wi-Fi
#include <Wire.h> // Library untuk I2C
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C
#include <HTTPClient.h> // Library untuk HTTP request
#include "time.h"
// Inisialisasi LCD I2C dengan alamat 0x27 dan ukuran 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Nama SSID dan password Wi-Fi
const char* ssid = "Wokwi-GUEST";
const char* password = ""; // Tanpa password
// Zona waktu dan NTP server
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 28800; // GMT+7 (WIB) = 7 jam * 3600 detik
const int daylightOffset_sec = 0; // Tidak ada perbedaan daylight saving time di WIB
// Pin untuk potentiometer (menggunakan ADC pin)
const int potentiometerPin = 34; // GPIO 34 adalah pin ADC pada ESP32
// Rentang nilai ADC dari 0 hingga 4095 (resolusi ADC 12-bit)
const int adcMaxValue = 4095;
// Rentang nilai pH yang akan disimulasikan dari 0 hingga 14
const float pHMin = 0.0;
const float pHMax = 14.0;
// URL server untuk memasukkan data pH
const char* serverName = "https://proyek-yusman.com/insert_data_ph.php?ph=";
void setup() {
// Mulai komunikasi serial
Serial.begin(115200);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("pH Sensor");
// Menghubungkan ke jaringan Wi-Fi
WiFi.begin(ssid, password);
Serial.println("Connecting to WiFi...");
// Tunggu sampai terhubung
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
lcd.setCursor(0, 1);
lcd.print("Connecting WiFi");
}
// Mengatur waktu dari NTP server
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime(); // Cetak waktu lokal
// Tampilkan alamat IP setelah terhubung
Serial.println("");
Serial.println("Connected to WiFi!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// Tampilkan status koneksi Wi-Fi di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Connected");
lcd.setCursor(0, 1);
lcd.print("IP: ");
lcd.print(WiFi.localIP());
delay(2000); // Tunggu sejenak sebelum mulai membaca sensor
}
void loop() {
printLocalTime(); // Cetak waktu lokal setiap detik
delay(1000);
// Cek status koneksi Wi-Fi secara berkala
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Koneksi Wi-Fi terputus. Menghubungkan kembali...");
WiFi.begin(ssid, password);
lcd.setCursor(0, 1);
lcd.print("Reconnect WiFi ");
}
// Membaca nilai dari potentiometer
int potValue = analogRead(potentiometerPin); // Baca nilai ADC dari potentiometer
// Konversi nilai ADC ke rentang pH (0 - 14)
float pHValue = (potValue / (float)adcMaxValue) * (pHMax - pHMin) + pHMin;
// Tentukan kondisi berdasarkan nilai pH
String Status;
if (pHValue < 6.5) {
Status = "Asam";
} else if (pHValue >= 6.6 && pHValue <= 8.5) {
Status = "Netral";
} else if (pHValue > 8.5) {
Status = "Basa";
}
// Tampilkan hasil pembacaan potentiometer (nilai pH) di Serial Monitor
Serial.print("Potentiometer Value: ");
Serial.print(potValue);
Serial.print(" | pH: ");
Serial.print(pHValue, 2); // Menampilkan nilai pH dengan 2 desimal
Serial.print(" | Status: ");
Serial.println(Status);
// Tampilkan hasil pembacaan pH di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("pH: ");
lcd.setCursor(4, 0);
lcd.print(pHValue, 2); // Menampilkan nilai pH dengan 2 desimal
lcd.print(" | ");
lcd.println(Status);
lcd.setCursor(0, 1);
lcd.print("WiFi: ");
if (WiFi.status() == WL_CONNECTED) {
lcd.print("Connected");
// Mengirim data pH ke server
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
// Buat URL untuk request
String serverPath = String(serverName) + String(pHValue, 2);
// Mulai request
http.begin(serverPath.c_str());
// Kirim request GET
int httpResponseCode = http.GET();
// Cek status response
if (httpResponseCode > 0) {
Serial.print("Data berhasil dikirim, Kode Response: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Error saat mengirim data: ");
Serial.println(httpResponseCode);
}
// Tutup koneksi HTTP
http.end();
}
} else {
lcd.print("Disconnected");
}
delay(1000); // Baca sensor setiap 1 detik
}
// Fungsi untuk menampilkan waktu lokal
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Gagal mendapatkan waktu dari server NTP");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); // Tampilkan waktu dalam format human-readable
}