#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <PZEM004Tv30.h>
#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);
#define relayPin 5 // Adjust according to relay module connection
#define increaseButton 9
#define decreaseButton 8
#define powerOffButton 7
PZEM004Tv30 pzem(10, 11); // RX, TX pins
float currentLimit = 10.0; // Initial current limit
bool isOn = true; // Initial state of the circuit
void setup() {
pinMode(relayPin, OUTPUT);
pinMode(increaseButton, INPUT_PULLUP);
pinMode(decreaseButton, INPUT_PULLUP);
pinMode(powerOffButton, INPUT_PULLUP);
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display();
delay(1000);
display.clearDisplay();
}
void loop() {
// Read values from PZEM-004T module
float current = pzem.current();
float voltage = pzem.voltage();
float power = pzem.power();
float pf = pzem.pf();
if (digitalRead(increaseButton) == LOW) {
if (currentLimit < 40.0) {
currentLimit += 1.0;
}
delay(100); // debounce
}
if (digitalRead(decreaseButton) == LOW) {
if (currentLimit > 1.0) {
currentLimit -= 1.0;
}
delay(100); // debounce
}
if (digitalRead(powerOffButton) == LOW) {
isOn = !isOn;
digitalWrite(relayPin, isOn);
delay(100); // debounce
}
if (isOn) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("Limit: ");
display.print(currentLimit);
display.println(" A");
display.print("Current: ");
display.print(current);
display.println(" A");
display.print("Voltage: ");
display.print(voltage);
display.println(" V");
display.print("Power: ");
display.print(power);
display.println(" W");
display.print("PF: ");
display.println(pf);
display.display();
} else {
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(SSD1306_WHITE);
display.setCursor(2,2);
display.print("OFF");
display.display();
}
// check for overload
if ( current > currentLimit) {
digitalWrite(relayPin, LOW); // Turn off the relay
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(SSD1306_WHITE);
display.setCursor(2,2);
display.print("OVER LOADED");
display.display();
}
}