#define BLYNK_TEMPLATE_ID "TMPL6Je2d29Vt"
#define BLYNK_TEMPLATE_NAME "sistem pemantauan kualitas air kolam renang"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h> // For I2C communication
// Blynk Auth Token
char auth[] = "YOUR_BLYNK_AUTH_TOKEN";
// WiFi Credentials
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// Sensor Pins
const int pH_Pin = A0;
const int Chlorine_Pin = A1;
const int WaterLevel_Pin = A2; // Optional
// Relay Pin
const int Pump_Relay = 13;
// Blynk Virtual Pins
const int pH_Value_Widget = V1;
const int WaterLevel_Widget = V2; // Optional
const int Pump_Control_Widget = V3;
// Calibration Values (Adjust based on your sensors)
const float pH_Offset = 0.0; // Add or subtract to calibrate pH reading
const float Chlorine_Offset = 0.0; // Add or subtract to calibrate chlorine reading
void setup() {
Serial.begin(115200);
// Initialize WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println(WiFi.localIP());
// Initialize Blynk
Blynk.begin(auth, ssid, password);
// Initialize Relay
pinMode(Pump_Relay, OUTPUT);
digitalWrite(Pump_Relay, LOW); // Relay off by default
// Initialize Sensors (Adjust based on your sensor types)
// ...
}
void loop() {
Blynk.run();
// Read Sensor Values
float pH_Reading = analogRead(pH_Pin);
float Chlorine_Reading = analogRead(Chlorine_Pin);
// ... (Read water level if using)
// Apply Calibration
pH_Reading += pH_Offset;
Chlorine_Reading += Chlorine_Offset;
// Send Data to Blynk
Blynk.virtualWrite(pH_Value_Widget, pH_Reading);
Blynk.virtualWrite(Chlorine_Value_Widget, Chlorine_Reading);
// ... (Send water level if using)
// Pump Control (Based on Blynk Widget Input)
if (Blynk.virtualRead(Pump_Control_Widget)) {
digitalWrite(Pump_Relay, HIGH); // Turn pump on
} else {
digitalWrite(Pump_Relay, LOW); // Turn pump off
}
delay(1000); // Update readings every second
}