#include <WiFi.h>
#include <ThingSpeak.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
// WiFi Configuration
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak Configuration
unsigned long channelID = 3016237;
const char* writeAPIKey = "EL4ETLVTVK2B5OU8";
// Pin Deklarasi
const int analogInputPin = 34;
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
const int buzzerPin = 14;
// OLED Display (128x64)
Adafruit_SSD1306 display(128, 64);
// Variabel Monitoring
float energy = 0;
bool alarmActive = false;
const float powerThreshold = 150.0;
WiFiClient client;
void setup() {
Serial.begin(115200);
// Inisialisasi OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Inisialisasi Pin
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// Pastikan LED dan buzzer mati di awal
setColor(0, 0, 0);
noTone(buzzerPin);
// Koneksi WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
ThingSpeak.begin(client);
// Tampilkan pesan awal di OLED
display.clearDisplay();
display.setCursor(0, 0);
display.println("Power Monitoring");
display.println("WiFi Connected");
display.display();
delay(2000);
}
void loop() {
// Baca nilai potensiometer (0-4095)
int rawValue = analogRead(analogInputPin);
// Simulasikan parameter listrik
float voltage = 220.0; // Tegangan tetap 220V
float current = map(rawValue, 0, 4095, 0, 1000) / 1000.0; // Arus 0-1A
float power = voltage * current; // Daya dalam Watt
energy += power * (30.0 / 3600.0); // kWh (interval 30 detik)
// Kontrol LED RGB berdasarkan daya
if (power < 50) {
setColor(0, 255, 0);
alarmActive = false;
noTone(buzzerPin);
} else if (power < powerThreshold) {
setColor(255, 255, 0);
alarmActive = false;
noTone(buzzerPin);
} else {
setColor(255, 0, 0);
alarmActive = true;
}
// Aktifkan alarm jika daya melebihi batas
if (alarmActive) {
tone(buzzerPin, 1000);
} else {
noTone(buzzerPin);
}
// Tampilkan data di Serial Monitor
Serial.print("Voltage: "); Serial.print(voltage); Serial.print("V");
Serial.print(" | Current: "); Serial.print(current, 3); Serial.print("A");
Serial.print(" | Power: "); Serial.print(power, 1); Serial.print("W");
Serial.print(" | Energy: "); Serial.print(energy, 4); Serial.println("kWh");
// Update OLED Display
display.clearDisplay();
display.setCursor(0, 0);
display.println("POWER MONITORING");
display.print("Voltage: "); display.print(voltage); display.println("V");
display.print("Current: "); display.print(current, 3); display.println("A");
display.print("Power: "); display.print(power, 1); display.println("W");
display.print("Energy: "); display.print(energy, 4); display.println("kWh");
if (alarmActive) display.println("ALARM: OVERLOAD!");
display.display();
// Kirim data ke ThingSpeak
ThingSpeak.setField(1, voltage);
ThingSpeak.setField(2, current);
ThingSpeak.setField(3, power);
ThingSpeak.setField(4, energy);
int statusCode = ThingSpeak.writeFields(channelID, writeAPIKey);
if (statusCode == 200) {
Serial.println("Data sent to ThingSpeak");
} else {
Serial.println("Problem sending to ThingSpeak. HTTP error code " + String(statusCode));
}
delay(10000); // Kirim data setiap 10 detik
}
// Fungsi untuk mengatur warna LED RGB
void setColor(int red, int green, int blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}